2017-08-08 47 views
2

不確定調用這個操作,Google沒有幫助。R:字符串的'相乘'dataframe列

說我有兩個簡單的dataframes這樣的:

df1 <- data.frame(factor1 = c("a", "b", "c")) 
df2 <- data.frame(factor2 = c("x", "y", "z")) 


> df1 
    factor1 
1  a 
2  b 
3  c 
> df2 
    factor2 
1  x 
2  y 
3  z 

我怎樣才能得到格式化這樣的數據幀:

factor1 factor2 
1  a  x 
2  a  y 
3  a  z 
4  b  x 
5  b  y 
6  b  z 
7  c  x 
8  c  y 
9  c  z 

我認爲,這種操作可能涉及dataframes乘以,但這是行不通的:

> df1 * df2 
    factor1 
1  NA 
2  NA 
3  NA 
Warning message: 
In Ops.factor(left, right) : ‘*’ not meaningful for factors 
+0

同樣的問題在這裏的另一種選擇:https://stackoverflow.com/questions/4309217/cartesian-product-data-frame-in-r – snoram

回答

4

這是一個cartes伊恩產品兩個數據幀的,當沒有共同的名字,你可以使用merge

merge(df1, df2) 

# factor1 factor2 
#1  a  x 
#2  b  x 
#3  c  x 
#4  a  y 
#5  b  y 
#6  c  y 
#7  a  z 
#8  b  z 
#9  c  z 

或者更明確:

merge(df1, df2, by=c()) 

?merge,當沒有列由加盟通過或兩者by.x和by.y

如果:,它返回一個笛卡爾乘積的兩個數據幀的長度爲零(零長度矢量或NULL),則結果r是x和y的笛卡爾乘積,即 dim(r)= c(nrow(x)* nrow(y),ncol x)+ ncol(y))。

+1

完美的感謝。所有這些年來,我不知道這個功能存在於'merge()'函數中。 – user5359531

+0

不客氣。 – Psidom

2

這裏是expand.grid

Map(expand.grid, factor1 = df1, factor2 = df2)$factor 
# factor1 factor2 
#1  a  x 
#2  b  x 
#3  c  x 
#4  a  y 
#5  b  y 
#6  c  y 
#7  a  z 
#8  b  z 
#9  c  z