我对data.table包很陌生并且有一个简单的问题。我有两个data.tables与使用键进行比较。在data.table 1中,列C的值从" NO"到"好的"如果在data.table B中同样找到关键列A和B.此步骤不可避免地必须完成。
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]
感谢您的帮助!
答案 0 :(得分:4)
尝试:
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
(或使用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
是多余的