[英]How can I merge multiple dataframes with the same column names?
我有一个具有以下各列的“主”数据框:
userid, condition
由于有四个实验条件,因此我也有四个带有答案信息的数据框,其中包括以下几列:
userid, condition, answer1, answer2
现在,我想加入这些内容,以便合并用户ID,条件及其对这些条件的答案的所有组合。 每个条件在每行相应的列中应仅具有正确的答案。
master = data.frame(userid=c("foo","foo","foo","foo","bar","bar","bar","bar"), condition=c("A","B","C","D","A","B","C","D"))
cond_a = data.frame(userid=c("foo","bar"), condition="A", answer1=c("1","1"), answer2=c("2","2"))
cond_b = data.frame(userid=c("foo","bar"), condition="B", answer1=c("3","3"), answer2=c("4","4"))
cond_c = data.frame(userid=c("foo","bar"), condition="C", answer1=c("5","5"), answer2=c("6","6"))
cond_d = data.frame(userid=c("foo","bar"), condition="D", answer1=c("7","7"), answer2=c("8","8"))
如何将所有条件合并到主数据库中,所以主数据库表如下所示?
userid condition answer1 answer2
1 bar A 1 2
2 bar B 3 4
3 bar C 5 6
4 bar D 7 8
5 foo A 1 2
6 foo B 3 4
7 foo C 5 6
8 foo D 7 8
我尝试了以下方法:
temp = merge(master, cond_a, all.x=TRUE)
这给了我:
userid condition answer1 answer2
1 bar A 1 2
2 bar B <NA> <NA>
3 bar C <NA> <NA>
4 bar D <NA> <NA>
5 foo A 1 2
6 foo B <NA> <NA>
7 foo C <NA> <NA>
8 foo D <NA> <NA>
但是一旦我这样做
merge(temp, cond_b, all.x=TRUE)
条件B
没有值。 怎么来的?
userid condition answer1 answer2
1 bar A 1 2
2 bar B <NA> <NA>
3 bar C <NA> <NA>
4 bar D <NA> <NA>
5 foo A 1 2
6 foo B <NA> <NA>
7 foo C <NA> <NA>
8 foo D <NA> <NA>
您可以按以下方式使用Reduce()
和complete.cases()
:
merged <- Reduce(function(x, y) merge(x, y, all=TRUE),
list(master, cond_a, cond_b, cond_c, cond_d))
merged[complete.cases(merged), ]
# userid condition answer1 answer2
# 1 bar A 1 2
# 2 bar B 3 4
# 4 bar C 5 6
# 6 bar D 7 8
# 8 foo A 1 2
# 9 foo B 3 4
# 11 foo C 5 6
# 13 foo D 7 8
Reduce()
可能需要一些习惯。 您定义函数,然后提供对象list
以重复应用该函数。 因此,该语句就像:
temp1 <- merge(master, cond_a, all=TRUE)
temp2 <- merge(temp1, cond_b, all=TRUE)
temp3 <- merge(temp2, ....)
或类似的东西:
merge(merge(merge(master, cond_a, all=TRUE), cond_b, all=TRUE), cond_c, all=TRUE)
complete.cases()
创建一个逻辑向量,确定指定的列是否“完整”; 此逻辑向量可用于从合并的data.frame
子集中。
如OP所述,鉴于与主数据帧没有明确的关系,因此可以选择以下选项:
temp <-rbind(cond_a,cond_b,cond_c,cond_d)
temp[order(temp["userid"]),]
也许,如果知道任何关系,可能会有一个非简单的解决方案。
您可以将此SQL
表示为SQL
语句,然后使用sqldf
库执行该sqldf
。
cond_all = rbind(cond_a, cond_b, cond_c, cond_d)
> sqldf('select p.userid as userid, p.condition as condition, answer1, answer2 from master as p join cond_all as q on p.userid=q.userid and p.condition=q.condition order by userid, condition')
userid condition answer1 answer2
1 bar A 1 2
2 bar B 3 4
3 bar C 5 6
4 bar D 7 8
5 foo A 1 2
6 foo B 3 4
7 foo C 5 6
8 foo D 7 8
您在注释中提到,主数据帧具有cond数据帧中不存在的额外列。 您应该能够修改此SQL查询以在这种情况下仍然可以使用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.