数据 table shift by group 错误

Data table shift by group error

我有一个非常大的数据集,我想在其中按组获取同一行的滞后值。 data.table 包中详细记录了此功能,我还看到了它的其他示例。但是,对于我的数据,我不断收到错误消息,我无法弄清楚原因。

根据文档,这是这个过程。我可以 运行 这个并且它有效。

library(data.table)
DT = data.table(year=rep(2010:2011, each=3), v1=1:6)
DT[, c("lag1", "lag2") := shift(.SD, 1:2), by=year]

现在这是我的数据样本。

unique_id click_time
100005361 2017-11-09 03:58:32
100005371 2017-11-09 00:53:08
100005371 2017-11-09 04:38:52
100005371 2017-11-09 05:42:30
100005371 2017-11-09 05:42:31
100005371 2017-11-09 05:42:31
100005371 2017-11-09 05:42:32
100005371 2017-11-09 05:42:38
100005371 2017-11-09 05:42:51
100005371 2017-11-09 09:46:57
100005371 2017-11-09 09:46:58
100005371 2017-11-09 09:46:58
100005371 2017-11-09 09:47:00
100005371 2017-11-09 11:37:26
100005391 2017-11-09 05:04:36
100005391 2017-11-09 05:04:41
10000541 2017-11-09 10:55:35
100005411 2017-11-08 22:55:49
100005411 2017-11-08 22:56:14

这里有5个唯一的id。我想使用点击时间的滞后并将其加入适用的每一行。显然,如果只有 1 行或第一行,则不会有任何滞后。应用上面的代码应该是一个单一的班轮。这是我试过的。

DT[, c("last_click_time") := shift(.SD), by=unique_id]

这是遵循文档和我在其他地方看到的链接的语法,例如:How to create a lag variable within each group?

我收到一个错误,但我无法弄清楚:

Error in `[.data.frame`(DT, , `:=`(c("last_click_time"), shift(.SD)),  : 
  unused argument (by = unique_id)

即使我将时间戳替换为更简单的内容,错误仍然存​​在。

DT$click_time = seq(1,2000,length.out = 19)

知道为什么会弹出此错误吗?这让我抓狂!

编辑:这个问题的答案是我是个白痴。如果您在 data.frame() 对象上尝试此操作,您将收到我显示的错误。如果您转换为 data.table() ,那么代码将按预期工作。令人尴尬,但希望这个 post 对以后的其他人有用。

你的例子似乎对我有用,尽管我不得不稍微整理一下数据以确保它正确读取:

library( data.table )

DT <- fread( 'unique_id,click_time
100005361,2017-11-09 03:58:32
100005371,2017-11-09 00:53:08
100005371,2017-11-09 04:38:52
100005371,2017-11-09 05:42:30
100005371,2017-11-09 05:42:31
100005371,2017-11-09 05:42:31
100005371,2017-11-09 05:42:32
100005371,2017-11-09 05:42:38
100005371,2017-11-09 05:42:51
100005371,2017-11-09 09:46:57
100005371,2017-11-09 09:46:58
100005371,2017-11-09 09:46:58
100005371,2017-11-09 09:47:00
100005371,2017-11-09 11:37:26
100005391,2017-11-09 05:04:36
100005391,2017-11-09 05:04:41
10000541,2017-11-09 10:55:35
100005411,2017-11-08 22:55:49
100005411,2017-11-08 22:56:14' )

DT[, c("last_click_time") := shift(.SD), by=unique_id]

结果:

> head( DT )

   unique_id          click_time     last_click_time
1: 100005361 2017-11-09 03:58:32                  NA
2: 100005371 2017-11-09 00:53:08                  NA
3: 100005371 2017-11-09 04:38:52 2017-11-09 00:53:08
4: 100005371 2017-11-09 05:42:30 2017-11-09 04:38:52
5: 100005371 2017-11-09 05:42:31 2017-11-09 05:42:30
6: 100005371 2017-11-09 05:42:31 2017-11-09 05:42:31

我不确定这是否是最佳做法,但我个人避免使用 .SD 除非确实有必要。在这里你可以没有。我会使用它,它应该给出与上面相同的结果:

DT[, last_click_time := shift(click_time), by=unique_id]