【问题标题】:Update a column values for a subset of rows in DT1 based on DT2 column values根据 DT2 列值更新 DT1 中行子集的列值
【发布时间】:2018-10-03 20:30:51
【问题描述】:

我有以下两个data.tables

library(data.table)
DT1 = data.table(x=LETTERS[1:9], y=c(15:18,NA,20,NA, NA, 23) , v=1:9)
DT2 = data.table(x=LETTERS[1:9], y=99:107, v=19:27)

在加入 x 上的表时,如何更新 DT1$y 的值以匹配 DT2$y 的值,仅适用于 DT1 中 y 列为 NA 的行。

最终的结果是:

   x  y  v
1: A 15  1
2: B 16  2
3: C 17  3
4: D 18  4
5: E 103 5
6: F 20  6
7: G 105 7
8: H 106 8
9: I 23  9

我知道我可以执行以下操作来更新 DT1 中的整个 y 列,但不确定如何将 y 列更新限制为 NA 值。

DT[DT2, y:=i.y, on="x"]

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    这是一个“更新加入”:

    DT1[is.na(y), y := DT2[.SD, on=.(x), x.y]]
    

    它是如何工作的

    data.table 的语法是x[i, j],可以读作...

    1. i 的子集;那么
    2. j

    其他说明:

    • j 内部,.SD 指的是子集表。

    • x[i, on=, j]j内,x.*前缀表示该列取自x

    【讨论】:

    • 关于如何使用您的解决方案更新两列(x 和 y)而不是仅更新一列 y 的任何建议?谢谢!
    • @user6340762 如果我正确理解你的情况,我会做类似DT1[is.na(y), c("x", "y") := DT2[.SD, on=.(g), .(x.x, x.y)]]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-24
    • 1970-01-01
    • 2021-10-19
    • 2017-07-31
    • 2020-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多