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

时间:2015-09-03 08:56:40

标签: r data.table

我对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]

感谢您的帮助!

1 个答案:

答案 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是多余的