根据数据表

时间:2017-10-02 08:49:47

标签: r indexing data.table

假设我们有一个这样的数据表:

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

我错过了什么?

1 个答案:

答案 0 :(得分:3)

您可以使用replaceshift,即

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