我试图使用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
答案 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