我正在尝试按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
答案 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)