我想根据在另一个表的特定列中找到的值来更新表的值。即。
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的第34列中,没有出现在col&#34; z&#34; tb2应替换为&#34; NONE&#34;。这段代码实际上为这个短表做了工作。
tb1[,"w":=lapply(tb1$w,function(u){ifelse((u %in% tb2$z),u,"NONE")})]
然而,实际的表有超过两百万条记录,上述指令非常慢(在停止之前> 20分钟)。最后,我需要替换列中的所有值&#34; w&#39;,&#34; x&#34;和&#34; y&#34; tb1不在tb2 $ z中。什么是正确的&#34; data.table&#34;实现这个目标的方法?我已尝试对其进行子集化,假设在进行替换之前对值进行分组会更有效。我与.SD一起使用的组合都没有给出正确的答案。谢谢你的帮助。
答案 0 :(得分:1)
我们可以使用%chin%
在&#39; w&#39;中创建元素的逻辑索引。在&#39; z&#39;中找不到,然后在&#39; w&#39;中分配(:=
)相应的元素。到&#34;无&#34;。
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
如果我们需要更改&#39; tb1&#39;中的所有列基于&#39;&#39;在&#39; tb2&#39;的列中,我们可以遍历&#39; tb1&#39;的列。如前所示分配。
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