我有
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")])]
答案 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