【问题标题】:Filling in missing values in a data.table by reference通过引用填充data.table中的缺失值
【发布时间】:2020-04-05 19:06:31
【问题描述】:

假设我有一个缺少值的 data.table 和一个参考 data.table:

dt <- data.table(id = 1:5, value = c(1, 2, NA, NA, 5))

   id value
1:  1     1
2:  2     2
3:  3    NA
4:  4    NA
5:  5     5

ref <- data.table(id = 1:4, value = c(1, 2, 98, 99))

   id value
1:  1     1
2:  2     2
3:  3    98
4:  4    99

如何通过在两个data.tables中使用匹配的id来填充dtvalue列, 以便我得到以下data.table?

   id value
1:  1     1
2:  2     2
3:  3    98
4:  4    99
5:  5     5

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    我们可以使用连接 on 'id' 并将 'ref' (i.value) 中的值列分配 (:=) 到 'dt' 中的值列

    library(data.table)
    dt[ref, value := i.value, on = .(id)]
    dt
    #   id value
    #1:  1     1
    #2:  2     2
    #3:  3    98
    #4:  4    99
    #5:  5     5
    

    如果我们不想替换 'value' 列中原来的非 NA 元素

    dt[ref, value := fcoalesce(value, i.value), on = .(id)]
    

    【讨论】:

    • 啊,当然!我知道这很简单。非常感谢,阿克伦!!
    • 你能告诉我“i.value”是什么意思吗?而“on = .(id)”只是意味着使用名为“id”的列来匹配行,对吧?
    • @johnc th on = .(id) 是连接列on 那个'id'(它类似于by = 中的mergeleft_join。它将返回存在的行两个数据集中“id”的对应匹配。由于“值”的列名相同,i. 有助于从第二个数据集中识别列
    • @johnc 我的意思是,如果您引用的列名是 value1 或除“值”以外的任何其他名称,您可以简单地使用该名称而不是 i.,但 i. 也可以工作。就是唯一标识该列
    • @johnC 我会说 data.table 的小插曲可能是您可以阅读的一个地方
    猜你喜欢
    • 1970-01-01
    • 2015-07-25
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    • 2019-04-29
    • 2012-10-25
    相关资源
    最近更新 更多