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
我想根据在另一个 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