Группировка по изменениям стоимости при сохранении дат в R - PullRequest
0 голосов
/ 16 февраля 2019

Я пытаюсь сгруппировать свои данные по subject_lab и изменениям в subject_value, сохраняя при этом даты изменений для каждого subject_value для subject_lab для subject_ID.

Я изучил примеры dplyr и data.table, разбросанные по стеку, но я не нашел ничего подходящего для моей проблемы.

subject_id <- rep(1, each=10)
subject_date <- as.Date("2019-01-01"):(as.Date("2019-01-01")+29)
subject_date <- as.Date(subject_date, origin="1970-01-01")
subject_lab <- rep(1:3, each=10)
set.seed(123)
subject_value <- sample(0:4, size=30, replace=T)
subject_sample_df <- data.frame(subject_id, subject_date, subject_lab, 
subject_value)

   subject_id subject_date subject_lab subject_value
1           1   2019-01-01           1             1
2           1   2019-01-02           1             3
3           1   2019-01-03           1             2
4           1   2019-01-04           1             4
5           1   2019-01-05           1             4
6           1   2019-01-06           1             0
7           1   2019-01-07           1             2
8           1   2019-01-08           1             4
9           1   2019-01-09           1             2
10          1   2019-01-10           1             2
11          1   2019-01-11           2             4
12          1   2019-01-12           2             2
13          1   2019-01-13           2             3
14          1   2019-01-14           2             2
15          1   2019-01-15           2             0
16          1   2019-01-16           2             4
17          1   2019-01-17           2             1
18          1   2019-01-18           2             0
19          1   2019-01-19           2             1
20          1   2019-01-20           2             4
21          1   2019-01-21           3             4
22          1   2019-01-22           3             3
23          1   2019-01-23           3             3
24          1   2019-01-24           3             4
25          1   2019-01-25           3             3
26          1   2019-01-26           3             3
27          1   2019-01-27           3             2
28          1   2019-01-28           3             2
29          1   2019-01-29           3             1
30          1   2019-01-30           3             0

Ожидаемые результаты будут иметь следующий результат.Теперь в строках 4, 8, 20, 22 и 23 объединены временные рамки.

    id  start_date  stop_date   lab value
1   1   2019-01-01  2019-01-01  1   1
2   1   2019-01-02  2019-01-02  1   3
3   1   2019-01-03  2019-01-03  1   2
4   1   2019-01-04  2019-01-05  1   4
5   1   2019-01-06  2019-01-06  1   0
6   1   2019-01-07  2019-01-07  1   2
7   1   2019-01-08  2019-01-08  1   4
8   1   2019-01-09  2019-01-10  1   2
9   1   2019-01-11  2019-01-11  2   4
10  1   2019-01-12  2019-01-12  2   2
11  1   2019-01-13  2019-01-13  2   3
12  1   2019-01-14  2019-01-14  2   2
13  1   2019-01-15  2019-01-15  2   0
14  1   2019-01-16  2019-01-16  2   4
15  1   2019-01-17  2019-01-17  2   1
16  1   2019-01-18  2019-01-18  2   0
17  1   2019-01-19  2019-01-19  2   1
18  1   2019-01-20  2019-01-20  2   4
19  1   2019-01-21  2019-01-21  3   4
20  1   2019-01-22  2019-01-23  3   3
21  1   2019-01-24  2109-01-24  3   4
22  1   2019-01-25  2019-01-26  3   3
23  1   2019-01-27  2019-01-28  3   2
24  1   2019-01-29  2019-01-29  3   1
25  1   2019-01-30  2019-01-30  3   0

1 Ответ

0 голосов
/ 16 февраля 2019

Вы можете использовать data.table rleid, чтобы помочь вам с этим:

library(dplyr)
library(data.table)

df %>%
  select_all(funs(gsub(".*_", "", .))) %>%
  group_by(grp = rleid(id, lab, value)) %>%
  mutate(start_date = min(date),
         stop_date = max(date)) %>%
  ungroup() %>%
  distinct(id, start_date, stop_date, lab, value)

Вывод:

   id lab value start_date  stop_date
1   1   1     1 2019-01-01 2019-01-01
2   1   1     3 2019-01-02 2019-01-02
3   1   1     2 2019-01-03 2019-01-03
4   1   1     4 2019-01-04 2019-01-05
5   1   1     0 2019-01-06 2019-01-06
6   1   1     2 2019-01-07 2019-01-07
7   1   1     4 2019-01-08 2019-01-08
8   1   1     2 2019-01-09 2019-01-10
9   1   2     4 2019-01-11 2019-01-11
10  1   2     2 2019-01-12 2019-01-12
11  1   2     3 2019-01-13 2019-01-13
12  1   2     2 2019-01-14 2019-01-14
13  1   2     0 2019-01-15 2019-01-15
14  1   2     4 2019-01-16 2019-01-16
15  1   2     1 2019-01-17 2019-01-17
16  1   2     0 2019-01-18 2019-01-18
17  1   2     1 2019-01-19 2019-01-19
18  1   2     4 2019-01-20 2019-01-20
19  1   3     4 2019-01-21 2019-01-21
20  1   3     3 2019-01-22 2019-01-23
21  1   3     4 2019-01-24 2019-01-24
22  1   3     3 2019-01-25 2019-01-26
23  1   3     2 2019-01-27 2019-01-28
24  1   3     1 2019-01-29 2019-01-29
25  1   3     0 2019-01-30 2019-01-30
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...