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

时间:2016-04-06 09:01:57

标签: r replace data.table match

根据我的以下要求,我无法获得解决方案。 如果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

更新

我已经写了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 个答案:

答案 0 :(得分:4)

我们可以替换"空白" " Col2"中的值使用NA并使用na.locf将&NA替换为" New"由" Col1"分组的值和" Col3"。

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)]

答案 1 :(得分:3)

另一种选择是使用二进制连接与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