2013-09-29 37 views
3
df<-data.frame(w=c("r","q"), x=c("a","b")) 
y=c(1,2) 

如何將df和y組合到一個新的數據框中,該數據框包含來自df的行與來自y的元素的所有行的組合?在這個例子中,輸出應該是如何組合數據幀和矢量

data.frame(w=c("r","r","q","q"), x=c("a","a","b","b"),y=c(1,2,1,2)) 
    w x y 
1 r a 1 
2 r a 2 
3 q b 1 
4 q b 2 

回答

1
data.frame(lapply(df, rep, each = length(y)), y = y) 
0

這應該工作

library(combinat) 
df<-data.frame(w=c("r","q"), x=c("a","b")) 
y=c("one", "two") #for generality 
indices <- permn(seq_along(y)) 
combined <- NULL 
for(i in indices){ 
    current <- cbind(df, y=y[unlist(i)]) 
    if(is.null(combined)){ 
    combined <- current 
    } else { 
    combined <- rbind(combined, current) 
    } 
} 
print(combined) 

這裏是輸出:

 w x y 
    1 r a one 
    2 q b two 
    3 r a two 
    4 q b one 

...或使其更短(並不太明顯) :

combined <- do.call(rbind, lapply(indices, function(i){cbind(df, y=y[unlist(i)])})) 
0

首先,轉換類colu MNS從因子到字符:

df <- data.frame(lapply(df, as.character), stringsAsFactors=FALSE) 

然後,使用expand.grid以獲取的df行和元素的y所有組合一個索引矩陣:

ind.mat = expand.grid(1:length(y), 1:nrow(df)) 

最後通過的ind.mat於行循環得到結果:

data.frame(t(apply(ind.mat, 1, function(x){c(as.character(df[x[2], ]), y[x[1]])}))) 
2

這應該做你想做的事情,沒有太多的工作。

dl <- unclass(df) 
dl$y <- y 
merge(df, expand.grid(dl)) 
# w x y 
# 1 q b 1 
# 2 q b 2 
# 3 r a 1 
# 4 r a 2