#r #dataframe #dplyr #data.table #date-difference
#r #dataframe #dplyr #data.table #разница в дате
Вопрос:
Я хочу вычислить разницу между первой точкой касания путешествия пользователя и последней точкой касания путешествия пользователя, и это для всех поездок.
Вот (краткий) пример данных CJ
:
PurchaseID timestamp date
1 2016-03-12 22:18:34 2016-03-12
1 2016-03-13 05:25:49 2016-03-13
2 2015-07-18 13:00:38 2015-07-18
2 2015-08-07 19:16:59 2015-08-07
2 2015-11-03 12:31:35 2015-11-03
...
Я хочу создать новую переменную difference
, которая представляет собой разницу между первой и последней датой каждого идентификатора покупки.
Что я пробовал и должен работать в соответствии с другими статьями на этом сайте, так это следующее:
# difference
CJ <- data.table(CJ)
CJ[, difference := max(timestamp) - min(timestamp), by = PurchaseID]
Это дало ошибку:
Error in `[.data.frame`(CJ, , `:=`(diff, max(timestamp) - min(timestamp)), :
unused argument (by = PurchaseID)
Та же ошибка возникает, когда я использую только переменную date
.
В подмножестве моих данных эта ошибка не возникла. Пока я не могу найти основную причину. Есть мысли?
Кроме того, вывод dput
> dput(head(CJgroup))
structure(list(UserID = c(9558L, 9558L, 9558L, 9657L, 1L, 1L),
PurchaseID = c(1L, 1L, 1L, 2L, 3L, 4L), timestamp = structure(c(1457817514,
1457843149, 1457868381, 1437217238, 1438967819, 1446550295
), class = c("POSIXct", "POSIXt"), tzone = "Europe/Amsterdam"),
duration = c(5.786, 65.725, 6.492, 57, 120, 459), device = structure(c(2L,
2L, 2L, 1L, 1L, 1L), .Label = c("FIXED", "MOBILE"), class = "factor"),
touchpoint = c(7L, 7L, 7L, 4L, 7L, 1L), purchase_own = c(0L,
0L, 0L, 0L, 0L, 0L), purchase_any = c(0L, 0L, 0L, 0L, 0L,
0L), MobilePanel = c(0L, 0L, 0L, 0L, 0L, 0L), FixedPanel = c(0L,
0L, 0L, 0L, 17L, 17L), CIT = c(0, 0, 0, 0, 0, 0), FIT = c(1,
1, 1, 1, 1, 1), T1 = c(0, 0, 0, 0, 0, 1), T2 = c(0, 0, 0,
0, 0, 0), T3 = c(0, 0, 0, 0, 0, 0), T4 = c(0, 0, 0, 1, 0,
0), T5 = c(0, 0, 0, 0, 0, 0), T6 = c(0, 0, 0, 0, 0, 0), T7 = c(1,
1, 1, 0, 1, 0), T8 = c(0, 0, 0, 0, 0, 0), T9 = c(0, 0, 0,
0, 0, 0), T10 = c(0, 0, 0, 0, 0, 0), T12 = c(0, 0, 0, 0,
0, 0), T13 = c(0, 0, 0, 0, 0, 0), T14 = c(0, 0, 0, 0, 0,
0), T15 = c(0, 0, 0, 0, 0, 0), T16 = c(0, 0, 0, 0, 0, 0),
T18 = c(0, 0, 0, 0, 0, 0), T19 = c(0, 0, 0, 0, 0, 0), T20 = c(0,
0, 0, 0, 0, 0), T21 = c(0, 0, 0, 0, 0, 0), T22 = c(0, 0,
0, 0, 0, 0), devicemobile = c(1, 1, 1, 0, 0, 0), devicefixed = c(0,
0, 0, 1, 1, 1), purchase_comp = c(0, 0, 0, 0, 0, 0), date = structure(c(16872,
16873, 16873, 16634, 16654, 16742), class = "Date"), POS_comp = c(0,
0, 0, 0, 0, 0), POS_own = c(0, 0, 0, 0, 0, 0), CountTP = c(1L,
2L, 3L, 1L, 1L, 1L)), row.names = c(NA, 6L), class = "data.frame")
Комментарии:
1. Для меня это работает нормально. Я использую data.table 1.11.4
Ответ №1:
вот решение, использующее dplyr
пакет вместо data.table
.
Затем вы можете сделать следующее
library(dplyr)
CJgroup %>% select(PurchaseID, date) %>%
group_by(PurchaseID) %>%
summarise(difference = as.numeric(max(date) - min(date)))
# A tibble: 4 x 2
PurchaseID difference
<int> <dbl>
1 1 1
2 2 0
3 3 0
4 4 0
Комментарии:
1. Спасибо за ваш ответ и редактирование моего вопроса, чтобы улучшить его. Я попробовал ваше решение, но оно приводит только к одной строке:
> CJgroup %>% group_by(PurchaseID) %>% summarise(difference = as.numeric(max(date) - min(date))) difference 1 519
2. Я добавил запрошенный вами результат
3. Спасибо! Результат теперь такой же, как вы показали ранее. Теперь я просто объединю
PurchaseID
и включу его в свой набор данных. Еще раз спасибо!4. рад, что смог помочь