R - 根据其他表中的标准更新一列中的值

时间:2016-01-24 19:12:03

标签: r data.table subset

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

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一起使用的组合都没有给出正确的答案。谢谢你的帮助。

1 个答案:

答案 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
相关问题