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

如何使用filter()函数按年筛选多列数据中的最早日期记录

按年份筛选最早观测日期的实现方案

是否需要lubridate

需要搭配lubridate使用,核心原因两点:

  • 示例数据存在非法日期值(如2021-02-31,公历2月不存在31天),lubridate的日期转换函数可自动识别这类异常值,避免筛选逻辑出错
  • 提取年份、做日期大小比较的语法远简洁于基础R的字符串处理逻辑,不容易出格式匹配错误

具体实现语法

第一步:预处理数据

先加载依赖包,将原始字符串格式的日期列转为标准日期类型,提取年份字段,同时清理非法日期:

# 加载依赖
library(dplyr)
library(lubridate)

# 示例数据集构造,和给出的样例一致
animal_observe <- data.frame(
  first_observe_date = c("2022-05-03","2022-05-01","2022-04-23","2021-05-04","2021-02-31","2020-01-30","2020-05-20")
)

# 日期格式转换
animal_observe <- animal_observe %>%
  mutate(
    std_date = ymd(first_observe_date), # 把"年-月-日"格式的字符串转为标准Date类型
    observe_year = year(std_date) # 提取每条记录对应的年份
  ) %>%
  filter(!is.na(std_date)) # 移除非法日期对应的行,可根据数据实际情况调整处理逻辑

第二步:用filter()筛选每年最早日期

按年份分组后,保留组内日期等于当年最小日期的记录即可:

earliest_each_year <- animal_observe %>%
  group_by(observe_year) %>%
  filter(std_date == min(std_date)) %>%
  ungroup()

补充说明

  • 上述filter写法会保留同一年所有并列最早的观测记录,如果同一年有多条记录日期相同且都是当年最早,这些记录都会被返回
  • 不要直接对原始字符串格式的日期做大小比较,一旦出现日期格式不统一(比如月/日补零规则不一致),字符串比较结果会完全错误
  • 转换日期时生成的NA值不要直接删除,建议先回溯原始数据确认是录入错误后再做处理,避免误删有效记录

用给出的样例数据运行上述代码,返回的各年最早日期分别为:2020年对应2020-01-30、2021年对应2021-05-04、2022年对应2022-04-23,符合筛选预期。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 17:25:34