我正在使用当前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
这是一个bug还是我漏了什么?
编辑:正如Pascal所指出的那样,我最初示例中的错误是由于shift()
返回一个列表的结果。
shift
的输出是一个列表而不是向量。 - user3710546shift()
时,在语句组内和单独调用之间的区别。输出为列表会对此产生什么影响? - thagzonec(1,2,3,4) / list(c(1,2,3,4))
看看会发生什么。 - user3710546shift
返回向量而不是单元素列表。我建议添加一个FR。 - eddishift()
返回一个列表时可能会很有用。也许应该能够指定输出类型。或者,正如我所理解的那样,它只在单元素列表的情况下返回一个向量。 - thagzone