让我有这样一个数据框(df):
col1 col2 col3
x1 x3 x4
x2 y1 y2
y3 y4 y5
让另一个输入数据框(dfi)为:
col1 col2
y 2
x 1
所需的输出数据帧是:
数据框1(df1):
col1 col2 col3
x1 y1 y2
x2 y4 y5
数据框2(df2):
col1 col2 col3
y3 y1 x4
y4
数据框3(df3):
col1 col2 col3
y3 x3 y2
y5
也就是说,
我想创建数据框,其中
- 每列仅包含 x 值或仅包含 y 值
- 输入数据框 (dfi) 表示每个输出 dafa 框仅包含 2 个“y”列和 1 个“x”列
- 必须生成此类数据帧的所有可能的不同组合。
如何使用 R 创建此类数据框?我的原始数据框要大得多,第二个输入数据框 dfi 可以更改。我知道这是一个难题。我将非常高兴获得任何帮助。非常感谢。
最佳答案
不完全是您正在寻找的内容(列顺序不同)。这个问题确实非常具体,因此很难解释代码,但这里有一些注释:
使用 dfi 的 col1 查找 df 中的“x”和“y”列。对于 x --> xi 和 y --> yi。将结果放入如下列表中:
List of 2 $ :List of 3 ..$ col1: chr "y3" ..$ col2: chr [1:2] "y1" "y4" ..$ col3: chr [1:2] "y2" "y5" $ :List of 3 ..$ col1: chr [1:2] "x1" "x2" ..$ col2: chr "x3" ..$ col3: chr "x4"
使用 dfi 的 col2 ,并使用
Map
和combin
列出 ll 查找所有组合。我们还使用辅助函数 FUN 来均匀化向量长度。
完整代码如下:
ll <- lapply(dfi$col1,function(patt) lapply(df,function(x)x[grep(patt,x)]))
M <- max(dfi$col2)
## helper function to add '' if vectors don't have the same size
FUN = function(x){
res <- lapply(x,function(y){
if(length(y)<M)
y <- c(y,rep('',M-length(y)))
else y
})
as.data.frame(res)
}
ll_dat <- Map(function(x,m)combn(x,m,simplify=F,FUN),ll,dfi$col2)
Map(cbind,ll_dat[[1]],rev(ll_dat[[2]]))
# [1]]
# col1 col2 col3
# 1 y3 y1 x4
# 2 y4
#
# [[2]]
# col1 col3 col2
# 1 y3 y2 x3
# 2 y5
#
# [[3]]
# col2 col3 col1
# 1 y1 y2 x1
# 2 y4 y5 x2
关于通过分区列对数据框的列进行 R 组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29020265/