data.table v1.9.5(R)中shift()函数的奇怪行为
我正在使用当前的data.table v1.9.5(R)中shift()函数的奇怪行为,r,data.table,R,Data.table,我正在使用当前的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
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
这是一个错误还是我遗漏了什么
编辑:正如帕斯卡指出的,我的初始示例中的错误是由于shift()
返回一个列表。使用,shift()
在向量输入时返回向量,并且长度(n)==1
。也就是说,当答案是长度为1的列表时,为了方便起见,我们返回一个向量。这使我们能够做到:
DT[, col := shift(val, type = "lead")] # or "lag"
及
在这两种情况下,都会返回一个向量,:=
的RHS
在原子状态下,为方便起见,在内部用list()
包装,这会给出预期的行为
这就结束了。shift
的输出是一个列表,而不是一个向量。我理解这一点。但这一事实并不能解释(至少对我来说)我在一组语句中调用shift()
与单独调用它之间的区别。作为列表的输出会影响这一点吗?请尝试c(1,2,3,4)/list(c(1,2,3,4))
看看会发生什么。您肯定是对的,我发现作为列表的输出应该在我的第一个示例中抛出错误。然而,为什么作为列表的输出会导致我给出的第二个和第三个示例之间的差异(即,我只是尝试创建delta
和lag
)?我编辑了这个问题以反映您关于列表的观点——谢谢。可能是:=
强制为向量类型。
DT[, col := valA + shift(valB, type="lead")] # or "lag"