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
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
data.frame(lapply(df, rep, each = length(y)), y = y)
這應該工作
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)])}))
首先,轉換類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]])})))
這應該做你想做的事情,沒有太多的工作。
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