R语言如何删除每组最后观测日期早于2020年的子分组
实现思路
- 先将日期列转换为标准日期格式,避免字符串比较出现逻辑错误
- 按两个分组字段聚合,若原始数据未按日期排序,先在分组内按日期升序排列
- 过滤掉分组内最新日期早于2020-01-01的所有分组
可运行代码
library(dplyr) library(lubridate) # 原始数据 df <- data.frame( Servicio = c("Servicio 1", "Servicio 1","Servicio 1","Servicio 1","Servicio 1","Servicio 1", "Servicio 2", "Servicio 2", "Servicio 2", "Servicio 2","Servicio 2","Servicio 2"), Subservicio = c("Sub 1","Sub 1","Sub 1","Sub 2","Sub 2","Sub 2","Sub 1","Sub 1","Sub 1","Sub 2" ,"Sub 2","Sub 2"), fecha = c("2020-01-01","2020-02-01","2020-03-01","2020-01-01","2020-02-01","2020-03-01", "2019-01-01","2019-02-01","2019-03-01","2020-01-01","2020-02-01","2020-03-01") ) # 处理逻辑 df_result <- df %>% # 转换为日期格式,也可以用base R的as.Date(fecha, "%Y-%m-%d") mutate(fecha = ymd(fecha)) %>% group_by(Servicio, Subservicio) %>% # 分组内按日期升序,确保取到的最后一条是最新日期 arrange(fecha, .by_group = TRUE) %>% # 仅保留最新日期>=2020年的分组 filter(last(fecha) >= ymd("2020-01-01")) %>% ungroup()
结果说明
你提供的示例数据中,Servicio 2下的Sub 1分组最新日期为2019-03-01,会被整体删除,其余3个符合要求的子分组会保留全部记录。如果你只需要保留每个符合要求分组的最后一条记录,在filter代码后添加slice_tail(n=1)即可。
内容的提问来源于stack exchange,提问作者Jorge Hernández
相关产品推荐
相关产品推荐

