R:根据其他数据框中的匹配行更新列

时间:2020-02-14 23:42:42

标签: r merge match

我有

mydf1 <- data.frame(ID = c(1,2,3,4,5), color = c("red", NA, NA, NA, "green"), name = c("tom", "dick", "harry", "steve", "mike"))
mydf2 <- data.frame(ID = c(1,2,99), color = c("red", "orange", "yellow"), name = c("tom", "dick", "Aaron"))

对于任何ID和名称都匹配的行,我想用mydf2中的相应颜色更新mydf1 $ color。所需的输出将是将第2行中的颜色更新为橙色,其余的保持不变:

   ID  color   name
1  1   red     tom
2  2   orange  dick
3  3   <NA>    harry
4  4   <NA>    steve
5  5   green   mike

我尝试了非对称合并的解决方案,如先前的文章中所述,但是在mydf1中获得了我某些字段的不希望的覆盖。然后,我尝试按照另一篇文章中的建议使用match,但收到一个错误。不知道为什么匹配条件不起作用。

mydf1$color <- mydf2$color[match(mydf1[c("ID", "name")], mydf2[c("ID", "name")])]

1 个答案:

答案 0 :(得分:2)

我们可以使用data.table on的'ID'和'name'列的联接,并通过赋值({{ 1}})

:=

library(data.table) setDT(mydf1)[mydf2, color := i.color, on = .(ID, name)] mydf1 # ID color name #1: 1 red tom #2: 2 orange dick #3: 3 <NA> harry #4: 4 <NA> steve #5: 5 green mike 适用于match,而不适用于vector/matrix。如果我们需要使用data.frame,则match从每个数据集中获取'ID','name'并执行paste

match

或使用i1 <- match(paste(mydf1$ID, mydf1$name), paste(mydf2$ID, mydf2$name), nomatch = 0)

tidyverse