r - 如何合并具有相同列名的多个数据框?

标签 r join merge dataframe

是)我有的:

我有一个具有以下各列的“主”数据框:

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中子集化。

关于r - 如何合并具有相同列名的多个数据框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13778267/

相关文章:

r - 在 R 包中使用静态(预构建)PDF 小插图

r - 匹配不同地 block 的填充梯度

r - 你能告诉我这个错误是什么意思吗?

r - ggplot2 道奇重叠 - 保留每个元素的宽度

sql - 为不存在日期的每个组获取额外的行

mysql - 根据字段值更改mysql表连接

merge - Excel - 将多列合并为一列

c++ - 如何更新这样的 map 结构?

git - 将2个分支 merge 为一个分支

python - 将两个数据框与 Pandas 合并后的行数不同