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