我正在使用当前的开发版本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
and 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
这是一个错误还是我在这里遗漏了一些东西?
编辑:正如帕斯卡指出的,我最初的示例中的错误是由于以下事实造成的:shift()
返回一个列表。