我有一个包含四列的数据框,我需要将其扩展以包含两个特定列的值之间的所有可能组合,而不删除其他列。
我的数据集的玩具版本:
mydf <- tibble(ID = c(1:3), Group = rep("XX",3) ,Names1 = c("a","b","b"),Names2 = c("c","d","e"))
mydf
ID Group Names1 Names2
1 1 XX a c
2 2 XX b d
3 3 XX b e
当我在变量 Names1 和 Names2 上使用
expand.grid()
时,我获得了我想要的组合,但其他列消失了。其他执行类似操作的函数(如 expand()
和 complete()
)不起作用,因为它们会删除 Names1 中的重复值。
expand.grid(mydf$Names1, mydf$Names2)
Var1 Var2
1 a c
2 b c
3 b c
4 a d
5 b d
6 b d
7 a e
8 b e
9 b e
我尝试在
expand.grid()
内调用 mutate()
,但结果是 expand.grid()
的复制输出。
mydf %>% mutate(Combs = nest(expand.grid(Names1, Names2)))
A tibble: 3 x 5
ID Group Names1 Names2 Combs$data
<int> <chr> <chr> <chr> <list>
1 1 XX a c <tibble [9 x 2]>
2 2 XX b d <tibble [9 x 2]>
3 3 XX b e <tibble [9 x 2]>
我想获得类似的东西,保留 Names1 中的其余列和复制值:
ID Group Names1 Names2
1 1 XX a c
2 2 XX b c
3 3 XX b c
4 1 XX a d
5 2 XX b d
6 3 XX b d
7 1 XX a e
8 2 XX b e
9 3 XX b e
我更喜欢使用 tidyverse 来完成此操作,因为我计划在完整数据集上使用
group_by(Group)
。
谢谢您的帮助!
这已经晚了 3 年,但你可以这样做:
library(tidyverse)
#Your data
mydf <- tibble(ID = c(1:3), Group = rep("XX",3) ,Names1 = c("a","b","b"),Names2 = c("c","d","e"))
#make an empty column just with those combinations
empty_names <- mydf %>%
expand(Names1, Names2)
#join on those columns
mydf %>%
full_join(empty_names)
注意,这将在其他列中为您提供 NA,因为该组合最初不存在,但这是有道理的,因为 R 不“知道”在那里放什么。合并后,您始终可以使用 mutate() 和 case_when() 根据您拥有的任何规则重新填充这些列,例如 Group 的所有值都是 XX。