合并并替换两个 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.table
s(或使用 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
是多余的
我对 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.table
s(或使用 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
是多余的