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

如何在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()

逻辑说明

  1. 先把date转为日期类型,避免字符串排序导致的时间顺序错误
  2. 按ID分组后,对每组内的记录按date升序排列,确保首尾行对应该ID的最早和最晚时间点
  3. 筛选条件:
    • 首行仅当coverage等于3时保留,否则剔除
    • 末行仅当coverage等于3时保留,否则剔除
    • 中间行无论coverage值是什么,全部保留

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 11:31:02