合并并替换两个 data.tables 中的值

merge and replace values in two data.tables

我对 data.table 包还很陌生,有一个简单的问题。我有两个data.table是比较按键的使用。在 data.table 1 中,如果在 data.table B 中同样找到关键列 A 和 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.table2 中 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]

感谢您的帮助!

尝试:

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 代替 <- 运算符

键入它们
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 是多余的