R语言基于条件对分组数据框筛选指定观测的实现咨询
R语言分组筛选实现方案
依赖包
需提前安装加载dplyr用于数据分组处理,lubridate用于日期格式校验:
install.packages(c("dplyr", "lubridate")) library(dplyr) library(lubridate)
核心实现逻辑
按ID分组后先对组内数据按日期升序排列,再根据组内Test的取值情况匹配筛选规则:
- 组内所有Test均为0:取组内最后一行(对应最新日期)
- 组内所有Test均为1:取组内第一行(对应最早日期)
- 组内同时存在0和1:取第一个Test取值为1的行
完整代码示例
1. 构造示例测试数据
df <- tibble( ID = c(rep("A",3), rep("B",3), rep("C",3)), Date = ymd(c("2023-01-01", "2023-01-02", "2023-01-03", "2023-01-01", "2023-01-02", "2023-01-03", "2023-01-01", "2023-01-02", "2023-01-03")), Test = c(0,0,0, 0,1,1, 1,1,1) )
2. 执行筛选
result <- df %>% # 按ID和日期升序排列,保证日期顺序正确 arrange(ID, Date) %>% group_by(ID) %>% slice( case_when( max(Test) == 0 ~ n(), min(Test) == 1 ~ 1, TRUE ~ which(Test == 1)[1] ) ) %>% ungroup()
3. 输出结果验证
上面的示例数据执行后得到的结果如下,完全符合筛选规则:
| ID | Date | Test |
|---|---|---|
| A | 2023-01-03 | 0 |
| B | 2023-01-02 | 1 |
| C | 2023-01-01 | 1 |
内容的提问来源于stack exchange,提问作者Dale Handley
相关产品推荐
相关产品推荐

