【发布时间】:2021-06-18 16:30:18
【问题描述】:
我有一个包含四列的数据框,我需要扩展它以包含两个特定列的值之间的所有可能组合,而不删除其他列。
我的数据集的玩具版本:
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
我尝试在mutate() 中调用expand.grid(),但结果是来自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)。
感谢您的帮助!
【问题讨论】:
-
我不明白您如何保留其他列。在您想要的结果中,
ID和Group列是否对应Names1值或Names2值的原始行?我认为你必须选择一个。 -
当
Names1 = a和Names2 = c你有ID = 1;当Names1 = a和Names2 = d你有ID = 1等等。似乎您为每个扩展行提供了与mydf中的变量Names1相对应的ID。Group呢?是否也从对应的Names1获取其值? -
您还想在数据中包含重复项吗? b c、b d 和 be 等值会重复。
-
是的,ID应该跟在Name1后面,Group不会改变。
标签: r dataframe tidyverse combinations expand