Сгруппировать по сумме в разнице дат в R - PullRequest
0 голосов
/ 18 марта 2019

Я пытаюсь использовать group_by, а затем подвести итог, используя вычисление разницы дат. Я не уверен, что это ошибка времени выполнения или что-то не так в том, что я делаю. Иногда, когда я запускаю код, я получаю вывод в виде дней, а другие - в виде секунд. Я не уверен, что вызывает это изменение. Я не меняю набор данных или коды. Набор данных, который я использую, огромен (2,304,433 строки и 40 столбцов). Оба раза выходные значения (цифры) одинаковы, но меняется только имя (дни в секундах). Я хотел бы видеть выходной в днях. Это код, который я использую:

data %>% 
group_by(PRODUCT,PERSON_ID) %>% 
summarise(Freq = n(),
          Revenue = max(TOTAL_AMT + 0.000001/QUANTITY), 
          No_Days = (max(ORDER_DT) - min(ORDER_DT) + 1)/n())

Это вывод .

Может кто-нибудь помочь мне в этом?

Ответы [ 2 ]

1 голос
/ 18 марта 2019

Использовать difftime() Возможно, вам потребуется указать единицы измерения.

set.seed(314)
data <- data.frame(PRODUCT = sample(1:10, size = 10000, replace = TRUE),
                   PERSON_ID = sample(1:10, size = 10000, replace = TRUE),
                   ORDER_DT = as.POSIXct(as.Date('2019/01/01') + sample(-300:+300, size = 10000, replace = TRUE)))


require(dplyr)

data %>% 
  group_by(PRODUCT,PERSON_ID) %>% 
  summarise(Freq = n(),
            start = min(ORDER_DT), 
            end = max(ORDER_DT)) %>%
  mutate(No_Days = (as.double(difftime(end, start, units = "days"), units = "days")+1)/Freq)

дает:

PRODUCT PERSON_ID  Freq start               end                 No_Days
<int>     <int> <int> <dttm>              <dttm>                <dbl>
1       1         1   109 2018-03-21 01:00:00 2019-10-27 02:00:00    5.38
2       1         2   117 2018-03-23 01:00:00 2019-10-26 02:00:00    4.98
3       1         3   106 2018-03-19 01:00:00 2019-10-28 01:00:00    5.56
4       1         4   109 2018-03-07 01:00:00 2019-10-26 02:00:00    5.50
5       1         5    95 2018-03-07 01:00:00 2019-10-16 02:00:00    6.2 
6       1         6    79 2018-03-09 01:00:00 2019-10-04 02:00:00    7.28
7       1         7    83 2018-03-09 01:00:00 2019-10-28 01:00:00    7.22
8       1         8   114 2018-03-09 01:00:00 2019-10-16 02:00:00    5.15
9       1         9   100 2018-03-09 01:00:00 2019-10-13 02:00:00    5.84
10      1        10    91 2018-03-11 01:00:00 2019-10-26 02:00:00    6.54
# ... with 90 more rows        
0 голосов
/ 18 марта 2019

Почему значение делится на n () ?

Простой as.integer(max(ORDER_DT) - min(ORDER_DT)) должен работать, но если это не так, пожалуйста, будьте более конкретны и сообщите мне больше информации.

Также при работе со значениями даты и времени полезно знать lubridate library

...