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