假设我们有一个这样的数据表:
DT <- data.table(x = 1:5, y = c(6, NA, 8, NA, 10), z = 11:15)
> DT
x y z
1: 1 6 11
2: 2 NA 12
3: 3 8 13
4: 4 NA 14
5: 5 10 15
我想将y中的NA值分配给z列上面的行中的值,因此输出将如下所示:
x y z
1: 1 6 11
2: 2 11 12
3: 3 8 13
4: 4 13 14
5: 5 10 15
我可以静态地(所有NAs将是15)这样做:
DT[is.na(y), `:=`(y = DT[5, z])]
但我喜欢这样的事情(不起作用):
DT[is.na(y), `:=`(y = DT[row-1, z])]
我错过了什么?
答案 0 :(得分:3)
您可以使用replace
和shift
,即
library(data.table)
DT[, y := replace(y, is.na(y), shift(z, type = 'lag')[is.na(y)])][]
给出,
x y z 1: 1 6 11 2: 2 11 12 3: 3 8 13 4: 4 13 14 5: 5 10 15
根据@ Jaap的评论我们可以避免replace
如下,
DT[is.na(y), y := DT[, shift(z, type = 'lag')[is.na(y)]]][]