R语言dplyr按ID分组筛选Status=1003的最新日期生成数据集
问题根因
- 你代码中使用的
subset()是R基础函数,无法识别dplyr中group_by()生成的分组属性,不会按分组维度执行筛选 - 代码缺失「提取每个ID对应最新日期」的核心处理逻辑,仅完成了状态过滤、字段选择和重命名操作,因此会返回所有Status='1003'的全量记录
正确实现代码
推荐使用dplyr原生函数按流程处理,性能更好且逻辑可控:
library(dplyr) desired <- table1 %>% # 提前过滤Status='1003'的记录,缩小后续处理的数据量 filter(Status == '1003') %>% # 若Date为字符串格式,先取消下一行注释转为标准日期类型,避免比较错误 # mutate(Date = as.Date(Date)) %>% # 按ID字段分组 group_by(ID) %>% # 筛选每个分组下Date为最大值(即最新日期)的记录 filter(Date == max(Date, na.rm = TRUE)) %>% # 选择输出字段,同时将Date重命名为New select(ID, New = Date) %>% # 移除分组属性,避免干扰后续数据操作 ungroup()
特殊场景适配
如果同一个ID存在多条记录的Date等于最新日期(即重复最新日期),且你只需要每个ID返回唯一一条最新日期结果,可以直接用聚合逻辑实现,自动去重:
library(dplyr) desired <- table1 %>% filter(Status == '1003') %>% # mutate(Date = as.Date(Date)) %>% group_by(ID) %>% # 直接聚合得到每个ID对应的最新日期,返回结果天然唯一 summarise(New = max(Date, na.rm = TRUE), .groups = "drop")
针对你给出的测试数据,上述两种写法最终返回的结果都为:
| ID | New |
|---|---|
| 001 | 2021-04-21 |
| 002 | 2021-07-21 |
Status为1004的ID=003不会出现在结果中,符合需求。
内容的提问来源于stack exchange,提问作者user17582908
相关产品推荐
相关产品推荐

