如何使用expand.grid在R中创建两列之间所有可能的组合?

问题描述 投票:0回答:2

我有一个包含四列的数据框,我需要将其扩展以包含两个特定列的值之间的所有可能组合,而不删除其他列。

我的数据集的玩具版本:

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)

谢谢您的帮助!

r dataframe tidyverse combinations expand
2个回答
0
投票

不确定这是否是您想要的。但它确实提供了所有可能的组合。也许值得一看。

my_grid <- expand_grid(ID = c(1:3), Group = rep("XX",3) , 
                   Names1 = c("a","b","b"), 
                   Names2 = c("c","d","e") )


0
投票

这已经晚了 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。

© www.soinside.com 2019 - 2024. All rights reserved.