如何在R中按分组筛选仅保留首尾时间点coverage为3的数据集
问题:按ID分组筛选首尾时间点coverage为3的记录
现有数据集包含ID、date、coverage三列,每个ID对应不同数量的日期,coverage为0至3的整数。需要在R中按ID分组筛选数据,仅保留每个分组中首尾时间点coverage等于3的记录(中间时间点记录不受此条件限制)。
示例输入
ID date coverage 001 2012-12-24 2 001 2013-12-04 3 001 2014-12-14 1 001 2015-12-02 3 001 2016-12-02 0 002 2012-01-15 3 002 2013-11-15 1 002 2014-11-15 3 003 2019-01-15 1 003 2020-11-15 1 003 2021-11-15 3
示例输出
ID date coverage 001 2013-12-04 3 001 2014-12-14 1 001 2015-12-02 3 002 2012-01-15 3 002 2013-11-15 1 002 2014-11-15 3 003 2021-11-15 3
解决方案(使用dplyr包)
library(dplyr) # 处理数据的代码 processed_df <- your_data %>% # 将date列转为日期格式,确保时间排序正确 mutate(date = as.Date(date)) %>% # 按ID分组,并对每组内的记录按日期排序 group_by(ID) %>% arrange(date, .by_group = TRUE) %>% # 筛选逻辑:保留中间行,或首行且coverage=3,或末行且coverage=3 filter( row_number() != 1 | coverage == 3, row_number() != n() | coverage == 3 ) %>% ungroup()
逻辑说明
- 先把
date转为日期类型,避免字符串排序导致的时间顺序错误 - 按
ID分组后,对每组内的记录按date升序排列,确保首尾行对应该ID的最早和最晚时间点 - 筛选条件:
- 首行仅当
coverage等于3时保留,否则剔除 - 末行仅当
coverage等于3时保留,否则剔除 - 中间行无论
coverage值是什么,全部保留
- 首行仅当
内容的提问来源于stack exchange,提问作者alison123456
相关产品推荐
相关产品推荐

