使用另一个数据框更新一个数据框的特定行,而不非特定地覆盖其他条目 (R)

Updating specific rows of one data frame using another, without non-specifically overwriting other entries (R)

我想使用 df1 更新 df2,以生成看起来像 df3 的数据框。任何帮助将非常感激。

df1 <- data.frame(ID=c("D-10003","D-10004"), date=c(2,2), length=c(22,45))
df2 <- data.frame(ID=c("D-10001","D-10003","D-10002","D-10004","D-10005"), date=c(1,NA,NA,NA,2), hair=c(2,3,NA,2,3))
df3 <- data.frame(ID=c("D-10001","D-10003","D-10002","D-10004","D-10005"), date=c(1,2,NA,2,2),hair=c(2,3,NA,2,3))

我一直在尝试各种变体,但它似乎总是覆盖合法条目(例如,对于 ID D-10001,日期应保持为 1),我不知道为什么。

df2$date<-df1[match(df2$ID, df1$ID),2]

我建议这样:

sapply(dt1$ID,function(x)dt2$date[dt2$ID==x]<<-dt1$date[dt1$ID==x])

PS: 不需要对任何东西使用赋值。它是从函数内部分配的。

这是一个 data.table 解决方案:

library(data.table)
setDT(df1)
setDT(df2)
df2[df1, date := df1$date, on = c(ID = "ID")]
#         ID date hair
# 1: D-10001    1    2
# 2: D-10003    2    3
# 3: D-10002   NA   NA
# 4: D-10004    2    2
# 5: D-10005    2    3

与第一个发布的答案一样,不需要赋值,因为 df2 已就地修改。

这是另一个防止覆盖非 NA 值的选项,即使 ID 匹配也是如此:

df2[df1, `:=` (date = ifelse(is.na(date), df1$date, date)), on = c(ID = "ID")]

df2$date[is.na(df2$date)] <- df1$date[match(df2$ID[is.na(df2$date)],df1$ID)]