【问题标题】:data.table lag operator throwing errordata.table 滞后运算符抛出错误
【发布时间】:2015-01-20 19:20:43
【问题描述】:

您好,我正在尝试按组 ID 创建一个带有滞后变量的 data.table。某些 id 在 data.table 中只有 1 行,在这种情况下,用于滞后的移位运算符会给出错误,但前导运算符工作正常。这是一个例子

dt = data.table(id = 1, week = as.Date('2014-11-11'), sales = 1)
lead = 2
lag = 2
lagSalesNames = paste('lag_sales_', 1:lag, sep = '')
dt[,(lagSalesNames) := shift(sales, 1:lag, NA, 'lag'), by = list(id)]

这给了我以下错误

All items in j=list(...) should be atomic vectors or lists. If you are trying something like j=list(.SD,newcol=mean(colA)) then use := by group instead
 (much quicker), or cbind or merge afterwards.

但是,如果我用铅代替同样的方法,效果很好

dt[,(lagSalesNames) := shift(sales, 1:lag, NA, 'lead'), by = list(id)]

如果 data.table 有超过 1 行,它似乎也可以正常工作,例如您可以尝试以下 2 行,效果很好

dt = data.table(id = 1, week = as.Date(c('2014-11-11', '2014-11-11')), sales = 1:2)
dt[,(lagSalesNames) := shift(sales, 1:lag, NA, 'lag'), by = list(id)]

我在 R 版本 3.1.0 的 Linux 机器上使用 data.table 版本 1.9.5。任何帮助将不胜感激。

谢谢, 阿信

【问题讨论】:

  • 这是非常奇怪的行为。如果我连续运行 3 次,它会在前两次运行,然后在最后一次尝试时返回错误。
  • 是的,我也遇到了一些奇怪的行为。例如,在某些情况下代码运行为 lag = 2 但如果我输入 lag = 6 它会引发分段错误
  • 感谢 Arun 调查。

标签: r data.table


【解决方案1】:

感谢您的报告。现在在 data.table v1.9.5 中使用 commit #1722 修复了此问题(问题 #1014)。

现在按预期工作:

dt
#    id       week sales lag_sales_1 lag_sales_2
# 1:  1 2014-11-11     1          NA          NA

【讨论】:

  • 感谢您的快速转身。
  • 非常感谢 Arun 和 David,非常感谢。
猜你喜欢
  • 2019-01-24
  • 2022-11-16
  • 1970-01-01
  • 2018-12-30
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 2021-04-08
  • 1970-01-01
相关资源
最近更新 更多