这里使用 tidyverse。我有一个数据框,其中每小时都有条目(行),以及这一小时是否应用某种处理的信息。
id <- rep(5, 10)
time <- c(1,2,3,4,5,6,7,8,9,10)
drug <- c("A", "A", "A", "B", "A", "D", "A", "A", "C", "B")
df <- df <- tibble(id, time, drug)
我现在想找到治疗组的开始和停止时间点,我想象的结果是这样的:
start <- c(1,1,1,4,5,6,7,7,9,10)
stop <- c(4,4,4,5,6,7,9,9,10, NA)
df <- tibble(id, time, drug, start, stop)
id time drug start stop
<dbl> <dbl> <chr> <dbl> <dbl>
1 5 1 A 1 4
2 5 2 A 1 4
3 5 3 A 1 4
4 5 4 B 4 5
5 5 5 A 5 6
6 5 6 D 6 7
7 5 7 A 7 9
8 5 8 A 7 9
9 5 9 C 9 10
10 5 10 B 10 NA
我不知道如何找到这些群组。我尝试过
lead()
和 lag()
但失败了。
您可以使用
consecutive_id
功能进行分组。例如
df %>%
group_by(run=consecutive_id(drug)) %>%
mutate(start=min(time), stop=max(time)+1) %>%
ungroup() %>%
select(-run)
会回来
id time drug start stop
<dbl> <dbl> <chr> <dbl> <dbl>
1 5 1 A 1 4
2 5 2 A 1 4
3 5 3 A 1 4
4 5 4 B 4 5
5 5 5 A 5 6
6 5 6 D 6 7
7 5 7 A 7 9
8 5 8 A 7 9
9 5 9 C 9 10
10 5 10 B 10 11
这确实假设所有时间都是连续的