Разница дней между двумя датами в одном столбце в R - PullRequest
0 голосов
/ 17 января 2019

У меня есть фрейм данных со столбцом идентификатора и даты. Я хочу рассчитать разницу в днях между датой 1 и следующей датой для группы.

Я уже пробовал с пакетом dplyr, похоже, неправильно.

hist_trnx1 %>% group_by(card_id) %>% mutate(gap=round(c(NA,diff(purchase_date)), 1))

Я хотел бы получить результаты, как показано ниже

   Card_ID         date                  Diff   
1. C_ID_4e6213e9bc 2017-06-25 15:33:07   NA
2: C_ID_4e6213e9bc 2017-07-15 12:10:45   20
3: C_ID_4e6213e9bc 2017-08-09 22:04:29   34 
4: C_ID_4e6213e9bB 2017-03-10 10:06:26   NA #( Because of group change) 
5: C_ID_4e6213e9bB 2017-04-10 01:14:19   30 
6: C_ID_4e6213e9bD 2018-02-24 08:45:05   NA #( Because of group change )
7: C_ID_4e6213e9bD 2018-03-23 08:45:05   29

данные

structure(list(card_id = c("C_ID_4e6213e9bc", "C_ID_4e6213e9bc", 
"C_ID_4e6213e9bc", "C_ID_4e6213e9bc", "C_ID_4e6213e9bc", "C_ID_4e6213e9bc"
), 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))

1 Ответ

0 голосов
/ 17 января 2019

Я не уверен, что это самый красивый способ, и кто-то, вероятно, предложит более чистое решение, но это должно сработать (часть решения, найденная по адресу: вычитает значение из предыдущего ряда по группе )

Прежде всего, я импортирую ваши данные:

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 позволяет вам выбрать предыдущую строку, и, наконец, деление возвращает количество дней, проведенных.

Надеюсь, это поможет вам =)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...