Смещение таблицы данных по групповой ошибке - PullRequest
0 голосов
/ 11 мая 2018

У меня очень большой набор данных, в котором я хочу взять отстаиваемое значение строки для той же группы. Эта функциональность хорошо документирована в пакете 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 уникальных идентификаторов. Я хочу использовать задержку времени щелчка и присоединить его к каждой строке, где это применимо. Очевидно, что если есть только 1 ряд или 1-й ряд, то никакого отставания не будет. Применение приведенного выше кода должно быть однострочным. Это то, что я пытался.

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

Это соответствует синтаксису из документации и ссылок, которые я видел в других местах, например, здесь: Как создать переменную отставания в каждой группе?

Я получаю ошибку, которую не могу понять:

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 (), то код работает как надо. Смущающий, но, надеюсь, этот пост будет полезен кому-то еще позже.

1 Ответ

0 голосов
/ 11 мая 2018

Ваш пример мне подходит, хотя мне пришлось немного привести в порядок данные, чтобы убедиться, что они правильно читаются:

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

IОтмечу, уверен, что это лучшая практика или нет, но я лично избегаю использования .SD, если это действительно не нужно.Здесь вы можете обойтись без.Я бы использовал это, что должно дать идентичный результат выше:

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