按值的变化分组,同时在R中保留日期

时间:2019-02-15 22:28:14

标签: r dplyr

我正在尝试按subject_lab分组数据,并更改subject_value,同时保持每个subject_lab每个subject_ID的每个subject_value的更改日期。

我已经研究了dplyr和data.table示例,这些示例分散在整个stackoverflow中,但是我还没有找到能解决我问题的方法。

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 :(得分:0)

您可以使用data.table的{​​{1}}来帮助您:

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)