我尝试将一个数据帧中的列数据合并到第二个数据帧中的另一列,使用具有共享数据的列作为操作的键。我已经尝试了几个关于如何在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工作了几个星期。
答案 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)