【问题标题】:R - Update a Value in One Column Based on Criteria in Other TablesR - 根据其他表中的条件更新一列中的值
【发布时间】:2016-01-24 19:12:02
【问题描述】:

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

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”。这段代码实际上是为这个短表工作的。

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

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

【问题讨论】:

    标签: r data.table subset


    【解决方案1】:

    我们可以使用%chin%来创建在'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
    

    【讨论】:

    • 像魅力一样工作!谢谢!
    • @LDB​​erriz 很高兴知道这行得通。我能知道你的原始数据集花了多少时间吗?
    • 不到一秒 ... 1437240 条记录,分 6 列。
    • 实际上是 20 毫秒。用户系统经过 0.02 0.00 0.02
    • @LDB​​erriz 感谢您的反馈。
    猜你喜欢
    • 2015-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-03
    • 1970-01-01
    • 2021-10-19
    • 1970-01-01
    相关资源
    最近更新 更多