R data.table:使用shift()更新不能按预期工作

时间:2016-01-18 00:07:28

标签: r data.table

我试图使用shift在data.table列中使用低于它的值来丢失值,但是如果我首先创建一个临时变量,我只能让它工作。这是预期的行为吗? MWE:

library(data.table)

dt <- data.table(x=c(1, NA))
dt[is.na(x), x:=shift(x)]
# Fails

dt <- data.table(x=c(1, NA))
dt <- dt[, x.lag:=shift(x)]
dt[is.na(x), x:=x.lag]
# Works

1 个答案:

答案 0 :(得分:3)

我对data.table有点新意,但我认为滚动连接可能就是你在此之后所做的事情。据推测,当序列中存在多个缺失值时,您希望能够对数据点进行估算,在这种情况下,shift方法只会填充NA

您的示例有点太小,无法真正了解您正在做什么,但如果我将其扩展一点,以包含record列,其中缺少各种x值; < / p>

library(data.table)
dt <- data.table(record=1:10, x=c(1, NA, NA, 4, 5, 6, NA, NA, NA, 10))
> dt
    record  x
 1:      1  1
 2:      2 NA
 3:      3 NA
 4:      4  4
 5:      5  5
 6:      6  6
 7:      7 NA
 8:      8 NA
 9:      9 NA
10:     10 10

然后创建仅包含非缺失行的副本,并将密钥设置为x

dtNA <- dt[!is.na(x)]
setkey(dtNA, record)
> dtNA
   record  x
1:      1  1
2:      4  4
3:      5  5
4:      6  6
5:     10 10

然后在完整的记录列表上进行滚动连接(如果缺少值,前一个记录向前滚动)

dtNA[data.table(record=dt$record, key="record"), roll=TRUE]
    record  x
 1:      1  1
 2:      2  1
 3:      3  1
 4:      4  4
 5:      5  5
 6:      6  6
 7:      7  6
 8:      8  6
 9:      9  6
10:     10 10

与产生以下内容的方法相比(在NA中仍有x个值);

dt[, x.lag:=shift(x)]
dt[is.na(x), x:=x.lag]
> dt
    record  x x.lag
 1:      1  1    NA
 2:      2  1     1
 3:      3 NA    NA
 4:      4  4    NA
 5:      5  5     4
 6:      6  6     5
 7:      7  6     6
 8:      8 NA    NA
 9:      9 NA    NA
10:     10 10    NA