首页 文章

R中的data.table:在匹配其他两个列值后,用相同列中的值替换列值

提问于
浏览
4

根据我的要求,我无法得到解决方案 . 如果data.table(如下所示)在Col1和Col3中具有匹配值 . 替换Col2值(旧的与New-Val) .

Col1  Col2    Col3
1     old     a
1     old     a
1     New-Val a

操作数据表后应如下所示:

Col1  Col2    Col3
   1     New-Val a
   1     New-Val a
   1     New-Val a

Update:

我写了New-Val来理解这个要求 . 但是我无法匹配此值,因为它因Col1和Col3的不同值而异 . 例如如下:

Col1  Col2    Col3
1     blank   a
1     blank   a
1     New1    a
2     blank   b
2     new2    b
2     new2    b

同样,条目很大 . 所以我理想地希望匹配Col1和Col3,而在Col2中它是空白的(总是),无论匹配的Col1和Col3值是否匹配,它都将被替换 .

这应该被操纵为:

Col1  Col2    Col3
1     New1    a
1     New1    a
1     New1    a
2     new2    b
2     new2    b
2     new2    b

2 回答

  • 3

    我们可以将"Col2"中的"blank"值替换为NA,并使用 na.locf 将NA替换为"Col1"和"Col3"分组的"New"值 .

    library(zoo)
    dt[Col2=="blank", Col2 := NA]
    dt[, Col2 := na.locf(Col2, fromLast=TRUE) ,.(Col1, Col3)]
    dt
    #   Col1 Col2 Col3
    #1:    1 New1    a
    #2:    1 New1    a
    #3:    1 New1    a
    #4:    2 new2    b
    #5:    2 new2    b
    #6:    2 new2    b
    

    或者我们可以不使用任何其他包

    dt[, Col2 := Col2[Col2!='blank'][1L] , .(Col1, Col3)]
    
  • 4

    另一个选择是使用二进制连接与 by = .EACHI 结合 - 这也适用于因素

    dt[dt[Col2 != "blank"], Col2 := i.Col2, on = c("Col1", "Col3"), by = .EACHI]
    dt
    #    Col1 Col2 Col3
    # 1:    1 New1    a
    # 2:    1 New1    a
    # 3:    1 New1    a
    # 4:    2 new2    b
    # 5:    2 new2    b
    # 6:    2 new2    b
    

相关问题