让我有这样一个数据框(df):
col1 col2 col3
x1 x3 x4
x2 y1 y2
y3 y4 y5
让另一个输入数据帧(dfi)为:
col1 col2
y 2
x 1
所需的输出数据帧是:
data frame1(df1):
col1 col2 col3
x1 y1 y2
x2 y4 y5
data frame2(df2):
col1 col2 col3
y3 y1 x4
y4
数据框3(df3):
col1 col2 col3
y3 x3 y2
y5
即,
我想创建数据框
如何使用R创建此类数据框?我的原始数据帧要大得多,第二个输入数据帧dfi可以改变。我知道这是一个很难的问题。我会很高兴得到任何帮助。非常感谢。
答案 0 :(得分:2)
不完全是您要查找的内容(不是相同的列顺序)。问题非常具体,所以很难解释代码,但这里有一些注意事项:
使用dfi的col1在df中查找“x”和“y”列。对于x - > xi和y - >义。将结果放在如下列表中:
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,并列出ll以使用Map
和combin
查找所有组合。我们还使用辅助函数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