R语言如何筛选数据框中每年同月同日对应的所有行
实现方案
首先需要将字符串格式的日期转为标准日期类型,再提取月-日作为分组字段即可完成批量分组/筛选,以下给出3种不同场景下的常用实现方式:
方法1:tidyverse 方案(可读性最高)
适合中小数据集,代码逻辑清晰易理解:
library(tidyverse) library(lubridate) df_result <- df %>% # 转换日期格式,原数据为月-日-年格式,对应lubridate的mdy()函数 mutate(Date = mdy(Date), # 提取月日作为统一分组键,格式固定为两位月-两位日 month_day = format(Date, "%m-%d")) %>% # 按同月同日分组,如需单独筛选5月2日的数据,可替换为filter(month_day == "05-02") group_by(month_day) %>% arrange(month_day, Date) # 如需直接生成所有同月同日的分组列表,可在末尾补充 %>% group_split()
方法2:data.table 方案(大数据集最优)
你的数据集是覆盖11年的全量日度数据,用data.table处理性能优势更明显:
library(data.table) library(lubridate) # 转换为data.table对象 setDT(df) # 批量转换日期格式 df[, Date := mdy(Date)] # 生成月日分组键 df[, month_day := format(Date, "%m-%d")] # 按同月同日拆分得到分组列表 result_list <- split(df, by = "month_day") # 直接提取指定日期数据的用法:result_list[["05-02"]] 即可取出所有年份5月2日的行
方法3:base R 方案(无额外依赖)
如果不想加载第三方包,可用R原生函数实现:
# 转换日期格式 df$Date <- as.Date(df$Date, format = "%m-%d-%Y") # 生成月日分组字段 df$month_day <- strftime(df$Date, "%m-%d") # 按同月同日拆分得到分组列表 result_list <- split(df, df$month_day)
效果验证
以你提供的示例数据为例,05-02分组的输出结果如下:
| Date | Name | month_day |
|---|---|---|
| 2010-05-02 | Alexander | 05-02 |
| 2011-05-02 | Alexander | 05-02 |
| 2018-05-02 | Chris | 05-02 |
完全符合按同月同日聚合的需求,后续对所有日期做批量计算、筛选都可以直接基于分组结果操作。
内容的提问来源于stack exchange,提问作者Selina1
相关产品推荐
相关产品推荐

