Я не уверен, что это самый красивый способ, и кто-то, вероятно, предложит более чистое решение, но это должно сработать (часть решения, найденная по адресу: вычитает значение из предыдущего ряда по группе )
Прежде всего, я импортирую ваши данные:
df <- structure(list(card_id = c("C_ID_4e6213e9bc", "C_ID_4e6213e9bc", "C_ID_4e6213e9bB", "C_ID_4e6213e9B",
"C_ID_4e6213e9bD", "C_ID_4e6213e9bD" ),
purchase_date = structure(c(1498404787, 1500120645, 1502316269, 1504346786, 1489108459, 1519461905),
tzone = "UTC", class = c("POSIXct", "POSIXt"))),
.Names = c("card_id", "purchase_date"), class = c("data.table", "data.frame"),
row.names = c(NA, -6L))
И тогда это работает, когда я бегу:
df <- df %>%
group_by(card_id) %>%
arrange(purchase_date) %>%
mutate(diff = purchase_date - lag(purchase_date, default = first(purchase_date))) %>%
mutate(diff = round(diff/86400, digits = 2))
упорядочение позволяет вам быть уверенным, что вы вычитаете то, что вы хотите вычесть, тогда функция lag позволяет вам выбрать предыдущую строку, и, наконец, деление возвращает количество дней, проведенных.
Надеюсь, это поможет вам =)