【问题标题】:How to add values to a column in R based on ID? [duplicate]如何根据 ID 向 R 中的列添加值? [复制]
【发布时间】:2021-10-07 13:45:37
【问题描述】:

我有两个这样的数据表:

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 中的列文本应保持为空。

非常感谢您的帮助!

【问题讨论】:

    标签: r merge


    【解决方案1】:
    df1[is.na(text), text := df2[.SD, on = 'ID', text]]
    

    使用基本 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.frame 而不是 data.table,你会是什么代码?
    • @Gabesz 好问题,我添加了一个选项。当然还有其他选项,但几乎没有 data.table 那样简洁。
    • 太好了,谢谢!
    【解决方案2】:

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

    df3 <- merge(df1, df2, by="ID", all=T)
    
    df3[, text := fcoalesce(text.x, text.y)]
    df3
    

    【讨论】:

      【解决方案3】:

      我们可能会使用

      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>
      

      【讨论】:

      • 这假设df2中没有缺失值。
      • @sindri_baldur 这是 OP 显示为输入的内容。所以它不是assumption
      猜你喜欢
      • 1970-01-01
      • 2019-01-08
      • 1970-01-01
      • 2021-05-12
      • 1970-01-01
      • 2015-12-05
      • 2018-06-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多