gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:56:56 25 4
gpt4 key购买 nike

我对 data.table 包很陌生,有一个简单的问题。我有两个 data.tables 与键的使用进行了比较。在data.table 1 中,如果关键列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]

感谢您的帮助!

最佳答案

尝试:

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 键入它们而不是使用 <-运算符(operator)
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是多余的

关于r - 合并和替换两个 data.tables 中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32371188/

25 4 0