合并R中两个数据帧中的单个列,其中只有一些行匹配

时间:2015-02-10 16:57:10

标签: r

我尝试将一个数据帧中的列数据合并到第二个数据帧中的另一列,使用具有共享数据的列作为操作的键。我已经尝试了几个关于如何在r中复制Excel vlookup的不同教程,我已经在stackoverflow的答案中尝试了几种不同的合并方法...但到目前为止我还没有尽管看起来它似乎是相当常见的功能,但尝试的确完全符合我的要求。

所以,这就是我想要做的......提供一个非常简单的例子,让我们说这是dataframe1:

ID      RESULT

4       YES
1       YES
3       NO
2       YES

以下是dataframe2,其中RESULT列完全由NA填充,其中一些将被dataframe1 $ RESULT中显示的内容替换(dataframe2 $ ID中的值多于dataframe1 $ ID,因此很多NAs合并后应该保留):

ID      RESULT

1       NA
8       NA
2       NA
9       NA
3       NA
6       NA
7       NA
4       NA

所以我想要的最终结果是dataframe3,其中RESULT包含YES或NO,如果dataframe1 $ RESULT中存在其中一个值,或者dataframe1 $ ID和dataframe2 $ ID之间没有匹配的NA。

ID      RESULT

1       YES
8       NA
2       YES
9       NA
3       NO
6       NA
7       NA
4       YES

我设法与以下内容合并,将一个列(RESULT.y)添加到dataframe1,但它也会删除dataframe2中与dataframe1不匹配的所有行:

dataframe3 <- merge(dataframe2, dataframe1, by=c("ID"))

我最终得到的是:

    ID      RESULT.x  RESULT.y

    4       NA        YES
    1       NA        YES
    3       NA        NO
    2       NA        YES

如果它只是添加了一个新列而不是修改现有列,我可以解决这个问题,但是我无法弄清楚如何让它离开其他行而不是消除它们。我尝试了以下操作,但它返回错误:

dataframe3 <- merge(dataframe2, dataframe1, by=c("ID", all.x = TRUE))

Error in fix.by(by.x, x) : 'by' must specify a uniquely valid column

非常非常感谢帮助......我只在r工作了几个星期。

2 个答案:

答案 0 :(得分:1)

您可以尝试rbind并仅选择不在df1

中的df2行
rbind(dataframe1, dataframe2[!dataframe2$ID %in% dataframe1$ID,])


    ID RESULT
1   4    YES
2   1    YES
3   3     NO
4   2    YES
21  8   <NA>
41  9   <NA>
6   6   <NA>
7   7   <NA>

答案 1 :(得分:1)

这是你的例子:

ID=c(4,1,3,2)
RESULT=c("YES","YES","NO","YES")
data1=data.frame(ID,RESULT)

ID=c(1,8,2,9,3,6,7,4)
RESULT=c("NA","NA","NA","NA","NA","NA","NA","NA")
data2=data.frame(ID,RESULT)

你可以添加:all=TRUE

dataframe3 <- merge(data1, data2, by=c("ID"),all=TRUE)