我正在使用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()
返回列表的事实的结果。
随着近期v1.9.5承诺,shift()
返回Vector矢量输入length(n) == 1
。也就是说,当答案为list
长度为1的a时,为方便起见,我们返回一个向量。这使我们能够:
DT[, col := shift(val, type = "lead")] # or "lag"
和
DT[, col := valA + shift(valB, type="lead")] # or "lag"
在这两种情况下,都返回一个向量RHS
,:=
当返回原子时,其向量list()
为方便起见在内部进行包装,从而产生了预期的行为。
关闭#1127。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句