R语言 确定每个独特案例的开始和停止时间

rjee0c15  于 2023-04-09  发布在  其他
关注(0)|答案(1)|浏览(127)

我有一个样本数据,看起来像这样:
| ID|日期|阶段|
| --------------|--------------|--------------|
| 1|2020-01-01 2020-01-01|红色|
| 1|2020-01-02 2020-01-02|黄色|
| 1|2020-01-03 2020-01-03|黄色|
| 1|2020-01-03 2020-01-03|绿色|
| 1|2020-01-04 2020-01-04|绿色|
| 1|2020-01-05 2020-01-05|红色|
| 二|2020-01-02 2020-01-02|红色|
| 二|2020-01-03 2020-01-03|红色|
| 二|2020-01-03 2020-01-03|黄色|
| 二|2020-01-04 2020-01-04|红色|
| 二|2020-01-05 2020-01-05|黄色|
| 二|2020-01-06 2020-01-06|黄色|
我想在R中找到一个基于dplyr的(或任何其他方法?)解决方案,以便我可以确定每个ID的每个连续阶段的开始和结束日期。变量Stages可以重复。最终输出应该看起来像这样:
| ID|阶段|开始日期|结束日期|
| --------------|--------------|--------------|--------------|
| 1|红色|2020-01-01 2020-01-01|2020-01-01 2020-01-01|
| 1|黄色|2020-01-02 2020-01-02|2020-01-03 2020-01-03|
| 1|绿色|2020-01-03 2020-01-03|2020-01-04 2020-01-04|
| 1|红色|2020-01-05 2020-01-05|2020-01-05 2020-01-05|
| 二|红色|2020-01-02 2020-01-02|2020-01-03 2020-01-03|
| 二|黄色|2020-01-03 2020-01-03|2020-01-03 2020-01-03|
| 二|红色|2020-01-04 2020-01-04|2020-01-04 2020-01-04|
| 二|黄色|2020-01-05 2020-01-05|2020-01-06 2020-01-06|

ibps3vxo

ibps3vxo1#

我们可以在汇总或reframe之前使用data.table::rleid/dplyr::consecutive_id创建分组列

library(dplyr) # version >= 1.1.0
df1 %>% 
  group_by(ID, grp = consecutive_id(Stages)) %>% 
  reframe(Stages = first(Stages), StartDate = first(Date),
    EndDate = last(Date)) %>%
  select(-grp)
  • 输出
# A tibble: 8 × 4
     ID Stages StartDate  EndDate   
  <int> <chr>  <chr>      <chr>     
1     1 Red    2020-01-01 2020-01-01
2     1 Yellow 2020-01-02 2020-01-03
3     1 Green  2020-01-03 2020-01-04
4     1 Red    2020-01-05 2020-01-05
5     2 Red    2020-01-02 2020-01-03
6     2 Yellow 2020-01-03 2020-01-03
7     2 Red    2020-01-04 2020-01-04
8     2 Yellow 2020-01-05 2020-01-06

如果我们使用的是旧版本的dplyr,请使用

library(data.table)
df1 %>%
   group_by(ID, grp = rleid(Stages)) %>%
   summarise(Stages = first(Stages), StartDate = first(Date),
    EndDate = last(Date)) %>%
  select(-grp)

数据

df1 <- structure(list(ID = c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 
2L, 2L), Date = c("2020-01-01", "2020-01-02", "2020-01-03", "2020-01-03", 
"2020-01-04", "2020-01-05", "2020-01-02", "2020-01-03", "2020-01-03", 
"2020-01-04", "2020-01-05", "2020-01-06"), Stages = c("Red", 
"Yellow", "Yellow", "Green", "Green", "Red", "Red", "Red", "Yellow", 
"Red", "Yellow", "Yellow")), class = "data.frame", 
row.names = c(NA, 
-12L))

相关问题