【问题标题】:merge and replace values in two data.tables合并和替换两个 data.tables 中的值
【发布时间】:2015-11-29 00:37:47
【问题描述】:

我对 data.table 包很陌生,有一个简单的问题。我有两个 data.tables 与键的使用进行比较。在 data.table 1 中,如果 key 列 A 和 B 在 data.table B 中相同,则 C 列的值从“NO”更改为“OK”。这一步是不可避免的,必须完成。

library(data.table)
df_1 <- data.frame(A=c(1,1,3,5,6,7), B = c("x","y","z","q","w","e"), C = rep("NO",6))
df_2 <- data.frame(A=c(3,5,1), B = c("z","q","x"), D=c(3,5,99))
keys <- c("A","B")
dt_1 <- data.table(df_1, key = keys)
dt_2 <- data.table(df_2, key = keys)
dt_1[dt_2, C := "OK"]

现在我得到了 data.table:

   A     B     C
1: 1     x     OK
2: 1     y     NO
3: 3     z     OK
4: 5     q     OK
5: 6     w     NO
6: 7     e     NO

我想包含第二个操作。如果在 data.table 2 中 A 列的值不等于 D 列,则应在第一次操作后使用 D 列的值。意思是 D 列优于 A。无论 D 中有多少不同的值,这都应该有效。所需的 data.table 如下所示:

   A     B     C
1: 99    x     OK
2: 1     y     NO
3: 3     z     OK
4: 5     q     OK
5: 6     w     NO
6: 7     e     NO

我厌倦了一些没有成功的事情。

dt_1[dt_2, A != D, A := D]

感谢您的帮助!

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    试试:

    dt_1[C == "OK", A:= dt_2[,D]]
    
    #   A B  C
    # 1: 99 x OK
    # 2:  1 y NO
    # 3:  3 z OK
    # 4:  5 q OK
    # 5:  6 w NO
    # 6:  7 e NO
    

    首先,您应该如何完成整个过程。

    首先将两个数据集创建为data.tables(或使用setDT 就地转换

    dt_1 <- data.table(A=c(1,1,3,5,6,7), B = c("x","y","z","q","w","e"), C = rep("NO",6))
    dt_2 <- data.table(A=c(3,5,1), B = c("z","q","x"), D=c(3,5,99))
    

    然后使用 setkeyv 而不是使用 &lt;- 运算符来键入它们

    keys <- c("A","B")
    setkeyv(dt_1, keys)
    setkeyv(dt_2, keys)
    

    然后只需更新单个连接中的两列

    dt_1[dt_2, `:=`(C = "OK", A = i.D)]
    #     A B  C
    # 1: 99 x OK
    # 2:  1 y NO
    # 3:  3 z OK
    # 4:  5 q OK
    # 5:  6 w NO
    # 6:  7 e NO
    

    在这种情况下,条件df_1$A != df_2$D 是多余的

    【讨论】:

    • 据我了解,如果您更改了dt_2$D 中的某些值,那么dt_1$A 中的相应值应该更改...无论如何您是对的,这只是他问题的快速解决方案。我正在寻找一些更一般的避免 dt_1 中 C 列的步骤
    • 感谢您的快速回复。将 C 列设置为 OK 的步骤是不可避免的。我编辑了问题。
    • @DavidArenburg,dt_2[2L, D := 1e3] 后第 2 行的值 A 与 D 不同,所以在 dt_1[3,A] 中改为 1000
    • @Andriy T. 到目前为止,它似乎以它应该的方式为我工作。我将仔细查看我的实际代码。
    • 我想这应该只是一次同时进行两种操作的一个衬里dt_1[dt_2, `:=`(C = "OK", A = D)]
    猜你喜欢
    • 2021-12-20
    • 2012-10-27
    • 2022-01-24
    • 2014-01-06
    • 2016-03-01
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    • 2019-02-13
    相关资源
    最近更新 更多