如何筛选截止年前最后观测年及截止年后所有观测数据?
筛选截止年份前后指定观测数据的解决方案
需求:筛选出截止年份之前的最后一个观测年份的所有观测数据,以及截止年份及之后所有年份的观测数据。
示例数据
d <- data.frame(group = c(1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2), cut_off = c(2017,2017,2017,2017,2017,2017,2017,2017,2017,2016,2016,2016,2016,2016,2016,2016), year = c(2000,2010,2010,2015,2015,2017,2017,2020,2024,2001,2009,2016,2017,2017,2021,2023), value = c(10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160)) # 查看数据 d
输出:
group cut_off year value 1 1 2017 2000 10 2 1 2017 2010 20 3 1 2017 2010 30 4 1 2017 2015 40 5 1 2017 2015 50 6 1 2017 2017 60 7 1 2017 2017 70 8 1 2017 2020 80 9 1 2017 2024 90 10 1 2016 2001 100 11 2 2016 2009 110 12 2 2016 2016 120 13 2 2016 2017 130 14 2 2016 2017 140 15 2 2016 2021 150 16 2 2016 2023 160
期望输出
desired <- data.frame(group = c(1,1,1,1,1,1,2,2,2,2,2,2), cut_off = c(2017,2017,2017,2017,2017,2017,2016,2016,2016,2016,2016,2016), year = c(2015,2015,2017,2017,2020,2024,2009,2016,2017,2017,2021,2023), value = c(40,50,60,70,80,90,110,120,130,140,150,160)) # 查看期望结果 desired
输出:
group cut_off year value 1 1 2017 2015 40 2 1 2017 2015 50 3 1 2017 2017 60 4 1 2017 2017 70 5 1 2017 2020 80 6 1 2017 2024 90 7 2 2016 2009 110 8 2 2016 2016 120 9 2 2016 2017 130 10 2 2016 2017 140 11 2 2016 2021 150 12 2 2016 2023 160
现有尝试
筛选截止年份及之后的数据可以直接用:
library(dplyr) d %>% filter(year >= cut_off)
输出:
group cut_off year value 1 1 2017 2017 60 2 1 2017 2017 70 3 1 2017 2020 80 4 1 2017 2024 90 5 2 2016 2016 120 6 2 2016 2017 130 7 2 2016 2017 140 8 2 2016 2021 150 9 2 2016 2023 160
但无法获取截止年份之前的最后一个观测年份的数据,尝试过lag()函数及分组组合均无效,例如:
d %>% filter(year >= cut_off | lag(year) < cut_off)
解决方案
通过按group和cut_off分组,先找出每个组内小于截止年份的最大观测年份,再筛选符合条件的数据:
library(dplyr) d %>% group_by(group, cut_off) %>% filter(year >= cut_off | year == max(year[year < cut_off], na.rm = TRUE)) %>% ungroup()
代码说明
group_by(group, cut_off):按分组和截止年份组合分组,确保每个组内的筛选逻辑独立。year >= cut_off:保留截止年份及之后的所有数据。year == max(year[year < cut_off], na.rm = TRUE):保留每个组内小于截止年份的最大观测年份的所有数据,na.rm = TRUE避免当组内没有小于截止年份的数据时报错。
运行后即可得到与期望输出一致的结果。
内容的提问来源于stack exchange,提问作者Stefan
相关产品推荐
相关产品推荐

