有没有一种方法来创建带有行的数据框,以用于其他数据框中的变量组合?

时间:2019-03-25 12:35:54

标签: r dataframe

我有几个数据帧,每个帧都包含一列。我想创建一个数据行,其中每个行都有其他数据帧中值的每种可能组合。

我尝试了一种针对每个数据帧嵌套循环的解决方法,但是由于我有大约20个数据帧,因此变得非常乏味。

# the data frames I already have
df1 <- data.frame(c("A","B","C")) 
colnames(df1) <- c("x")
df2 <- data.frame(c("ALPHA","BRAVO","CHARLIE")) 
colnames(df2) <- c("y")

# the data frame I want to create
df3 <- data.frame(c("A", "A", "A", "B", "B", "B", "C", "C", "C"),
                  c("ALPHA","BRAVO","CHARLIE", "ALPHA","BRAVO","CHARLIE", "ALPHA","BRAVO","CHARLIE"))
colnames(df3) <- c("x", "y")

2 个答案:

答案 0 :(得分:3)

一种选择是使用tidyr::crossing

tidyr::crossing(df1, df2)

#  df1$x df2$y  
#  <fct> <fct>  
#1 A     ALPHA  
#2 A     BRAVO  
#3 A     CHARLIE
#4 B     ALPHA  
#5 B     BRAVO  
#6 B     CHARLIE
#7 C     ALPHA  
#8 C     BRAVO  
#9 C     CHARLIE

您只需在其中添加所有数据框,它就会为您提供所有组合的输出。


在基数R中,您还可以通过将所有数据帧放在一个列表中来使用merge中的Reduce

Reduce(merge, list(df1, df2))

答案 1 :(得分:0)

我们可以使用CJ中的data.table

library(data.table)
CJ(x= df1$x, y = df2$y)
#  x       y
#1: A   ALPHA
#2: A   BRAVO
#3: A CHARLIE
#4: B   ALPHA
#5: B   BRAVO
#6: B CHARLIE
#7: C   ALPHA
#8: C   BRAVO
#9: C CHARLIE