如何解决在单个术语中使用组和行
假设我有一个单列标题
a
0
1
2
3
4
前三行和最后两行被分组。我想要一个 tidyverse 表达式来添加两列,其中包含组的 剩余 元素。因此,我想
a b c
0 1 2
1 0 2
2 0 1
3 4 NA
4 3 NA
目前,我使用这样的东西
df %>% mutate(b = a[1],c = a[2])
遗憾的是,这也会计算当前行。如何排除当前行的元素?
解决方法
首先我们生成具有定义分组的数据框:
df = data.frame(a=0:4,grp=rep(1:2,c(3,2)))
a grp
1 0 1
2 1 1
3 2 1
4 3 2
5 4 2
然后我们按组分组并使用 map()
和 setdiff
来获取其他元素。接下来我们爆炸它,然后再次旋转宽。可能有一些更简单的方法,但这是我能想到的:
library(dplyr)
library(purrr)
library(tidyr)
df %>% group_by(grp) %>%
mutate(other = map(a,~setdiff(a,.x))) %>%
unnest(other) %>%
group_by(a,grp) %>%
mutate(id = 1:n()) %>%
ungroup() %>%
pivot_wider(id_cols=a,names_from=id,values_from=other)
# A tibble: 5 x 3
a `1` `2`
<int> <int> <int>
1 0 1 2
2 1 0 2
3 2 0 1
4 3 4 NA
5 4 3 NA
,
我们首先创建我们的数据框
library(tidyverse)
df <- data.frame(group = rep(1:2,3:2),a = 0:4) %>% group_by(group)
这产生了
# A tibble: 5 x 2
# Groups: group [2]
group a
<int> <int>
1 1 0
2 1 1
3 1 2
4 2 3
5 2 4
现在,我们可以利用 combn
来访问所需的元素。如果额外列中剩余元素的顺序无关紧要,这就像
df %>% mutate(b = unlist(combn(rev(a),n() - 1,simplify = FALSE,`[`,1)),c = unlist(combn(rev(a),2)))
否则,我们必须做更多的工作才能正确地对元素重新排序(如您的问题)
df %>% mutate(b = unlist(combn(rev(a),function(x) {rev(x)[1]})),function(x) {rev(x)[2]})))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。