R - 根据其他表中的条件更新一列中的值

R - Update a Value in One Column Based on Criteria in Other Tables

我想根据在另一个 table 的特定列中找到的值更新 table 的值。即

tb1<-data.table(w=c('xray','yankee','zulu','alpha','bravo','charlie', 
                    'xray','yankee','zulu','alpha','bravo','charlie'),
                x=c('alpha','bravo','charlie','xray','yankee','zulu',
                    'xray','yankee','zulu','alpha','bravo','charlie'),
                y=c('zulu','yankee','xray','charlie','bravo','alpha'))

tb2<-data.table(z= c('alpha','bravo','charlie'),
                z2=c('zalpha','zbravo','zcharlie'))

在 tb1 的 "w" 列中,tb2 的 "z" 列中未出现的值应替换为 "NONE"。这段代码实际上完成了这个短 table 的工作。

tb1[,"w":=lapply(tb1$w,function(u){ifelse((u %in% tb2$z),u,"NONE")})]

然而,实际 table 有超过 200 万条记录,上面的指令非常慢(>20 分钟才停止)。最终,我需要替换 tb1 的 "w',"x" 和 "y" 列中不在 tb2$z 中的所有值。完成此操作的正确 "data.table" 方法是什么?我有尝试对其进行子集化,假设在进行替换之前对值进行分组会更有效。None 我与 .SD 一起使用的组合给了我正确的答案。感谢您的帮助。

我们可以使用%chin%为'w'中没有在'z'中找到的元素创建逻辑索引,然后赋值(:=)在'w'中对应的元素'w' 到 "NONE"。

tb1[!w %chin% tb2$z, w:= "NONE"]
tb1
#         w       x       y
# 1:    NONE   alpha    zulu
# 2:    NONE   bravo  yankee
# 3:    NONE charlie    xray
# 4:   alpha    xray charlie
# 5:   bravo  yankee   bravo
# 6: charlie    zulu   alpha
# 7:    NONE    xray    zulu
# 8:    NONE  yankee  yankee
# 9:    NONE    zulu    xray
#10:   alpha   alpha charlie
#11:   bravo   bravo   bravo
#12: charlie charlie   alpha

如果我们需要根据'tb2'的'z'列更改'tb1'中的所有列,我们可以遍历'tb1'的列并分配为较早显示。

nm1 <- names(tb1)
for(j in seq_along(tb1)){
  tb1[!tb1[[j]] %chin% tb2$z, nm1[j] := "NONE"]
}
tb1
#          w       x       y
# 1:    NONE   alpha    NONE
# 2:    NONE   bravo    NONE
# 3:    NONE charlie    NONE
# 4:   alpha    NONE charlie
# 5:   bravo    NONE   bravo
# 6: charlie    NONE   alpha
# 7:    NONE    NONE    NONE
# 8:    NONE    NONE    NONE
# 9:    NONE    NONE    NONE
#10:   alpha   alpha charlie
#11:   bravo   bravo   bravo
#12: charlie charlie   alpha