You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何筛选截止年前最后观测年及截止年后所有观测数据?

筛选截止年份前后指定观测数据的解决方案

需求:筛选出截止年份之前的最后一个观测年份的所有观测数据,以及截止年份及之后所有年份的观测数据。

示例数据

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()

代码说明

  1. group_by(group, cut_off):按分组和截止年份组合分组,确保每个组内的筛选逻辑独立。
  2. year >= cut_off:保留截止年份及之后的所有数据。
  3. year == max(year[year < cut_off], na.rm = TRUE):保留每个组内小于截止年份的最大观测年份的所有数据,na.rm = TRUE避免当组内没有小于截止年份的数据时报错。

运行后即可得到与期望输出一致的结果。

内容的提问来源于stack exchange,提问作者Stefan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 01:45:06