如何根据ID向R中的列添加值?

How to add values to a column in R based on ID?

我有两个这样的数据表:

df1 <- data.table(ID = 1:10,
                  text = c("a", NA, NA, "b", NA, "a", "a", NA, "c", NA))

df2 <- data.table(ID = c(2,3,8),
                  text = c("a", "b", "a"))

我想根据 ID 使用 df2 中的值填充 df1 中的文本列。请注意,并非每个 ID 在 df1 或 df2 中的文本列中都有值。

我希望我的结果如下所示:

    ID text
 1:  1    a
 2:  2    a
 3:  3    b
 4:  4    b
 5:  5 <NA>
 6:  6    a
 7:  7    a
 8:  8    a
 9:  9    c
10: 10 <NA>

如果可能,应从 df2 中获取值,否则 df1 中的列文本应保留为空。

非常感谢您的帮助!

df1[is.na(text), text := df2[.SD, on = 'ID', text]]

使用 base R data.frame 可以 实现类似的逻辑:

i_tm <- is.na(df1$text) # text missing at
df1[i_tm, 'text'] <- df2[match(df1[i_tm, 'ID'], df2$ID), 'text']
 

我以前从未使用过 data.table,但这似乎可以解决问题。 全连接然后合并

df3 <- merge(df1, df2, by="ID", all=T)

df3[, text := fcoalesce(text.x, text.y)]
df3

我们可以使用

df1[df2, text := i.text, on = .(ID)]

-输出

> df1
    ID text
 1:  1    a
 2:  2    a
 3:  3    b
 4:  4    b
 5:  5 <NA>
 6:  6    a
 7:  7    a
 8:  8    a
 9:  9    c
10: 10 <NA>