【发布时间】:2016-07-02 14:52:52
【问题描述】:
R 的data.table 中的shift 非常适合时间序列和时间窗口的内容。但是列表的列不会像其他元素的列那样滞后。在下面的代码中,gearLag 领先/滞后gear 正确,但gearsListLag 没有滞后gearsList,相反,shift 在gearsList 内运行以滞后同一行中的元素自身。
dt <- data.table(mtcars)[,.(gear, carb, cyl)]
### Make col of lists
dt[,carbList:=list(list(unique(carb))), by=.(cyl, gear)]
### Now I want to lag/lead col of lists
dt[,.(carb, carbLag=shift(carb)
, carbList, carbListLag=shift(carbList, type="lead")), by=cyl]
cyl carb carbLag carbList carbListLag
1: 6 4 NA 4 NA
2: 6 4 4 4 NA
3: 6 1 4 1 NA <-- should be 4 here, not NA
4: 6 1 1 1 NA
5: 6 4 1 4 NA
6: 6 4 4 4 NA
7: 6 6 4 6 NA
8: 4 1 NA 1,2 2,NA
9: 4 2 1 1,2 2,NA
10: 4 2 2 1,2 2,NA
11: 4 1 2 1,2 2,NA
12: 4 2 1 1,2 2,NA
13: 4 1 2 1,2 2,NA
14: 4 1 1 1 NA <-- should be (1,2) here, not NA
15: 4 1 1 1,2 2,NA
16: 4 2 1 2 NA
17: 4 2 2 2 NA
18: 4 2 2 1,2 2,NA
19: 8 2 NA 2,4,3 4, 3,NA
20: 8 4 2 2,4,3 4, 3,NA
21: 8 3 4 2,4,3 4, 3,NA
22: 8 3 3 2,4,3 4, 3,NA
23: 8 3 3 2,4,3 4, 3,NA
有什么建议可以像我在其他元素上滞后一样滞后于列表吗?
【问题讨论】:
-
shift似乎不支持列表。试试shift(list(list(1,2), list(3,4))) # Error Unsupported type 'list'。您可以从您看到的结果中看出它正在迭代列表并将shift分别应用于每个元素,这与您shift(.SD)时发生的情况一致(每列是一个列表元素,分别移动)。 -
您可能想在github page 上提出问题,以便更轻松地处理此问题
-
自 better solution was recently implemented 以来将其作为 dup 关闭。
-
@enfastication,我注意到您是最初提出问题的人。再次感谢。
标签: r list data.table lag