我正在使用data.table
(v1.9.5)的当前开发版本,主要是因为它拥有精彩的内置shift()
函数。
我注意到,当我尝试在data.table
通话中对语句进行分组时 - 其中一个是对shift()
的调用 - 我从中获得了一些时髦的行为:
library(data.table)
foo = data.table(x = c(1, 5, 6 ,2, 9, 8))
foo[, y := {
delta = c(NA, diff(x));
lag = shift(x, n = 1L, fill = NA);
list(delta/lag)}]
上述添加y
的尝试会引发以下错误:
Error in delta/lag : non-numeric argument to binary operator
所以,我只是创建delta
和lag
而不试图与他们进行互动来检查我得到的内容:
foo[, c('delta', 'lag') :=
list(c(NA, diff(x)),
shift(x, n = 1L, fill = NA))]
foo
x delta lag
1: 1 NA NA, 1, 5, 6, 2, 9
2: 5 4 NA, 1, 5, 6, 2, 9
3: 6 1 NA, 1, 5, 6, 2, 9
4: 2 -4 NA, 1, 5, 6, 2, 9
5: 9 7 NA, 1, 5, 6, 2, 9
6: 8 -1 NA, 1, 5, 6, 2, 9
如果我将呼叫分开,我可以得到我想要的内容:
foo[, delta := c(NA, diff(x))]
foo[, lag := shift(x, n = 1L, fill = NA)]
foo
x delta lag
1: 1 NA NA
2: 5 4 1
3: 6 1 5
4: 2 -4 6
5: 9 7 2
6: 8 -1 9
这是一个错误还是我错过了什么?
编辑:正如Pascal指出的那样,我的初始示例中的错误是shift()
返回列表的结果。