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

如何在R语言中按年份筛选Data Frame数据?

R语言按年份筛选Data Frame的正确方法

首先明确核心问题:你创建日期列b时,as.Date()默认采用%Y-%m-%d(年-月-日)格式解析字符串,但你传入的是%d-%m-%y(日-月-两位年)格式的日期,导致日期被错误解析,这是后续筛选全部失败的根源。

先修正数据创建代码:

library(tidyverse)

a <- c(10,20,30)
# 指定format参数匹配你的日期字符串格式
b <- as.Date(c('31-11-20', '15-11-21', '31-11-22'), format = "%d-%m-%y")
my_df <- data.frame(a,b)

方法一:用tidyverse提取年份直接筛选

这是最直观的方式,借助lubridate包(已随tidyverse加载)提取年份判断:

my_df_new <- my_df %>%
  filter(lubridate::year(b) == 2021)

方法二:修正你原有的between筛选逻辑

确保日期解析正确后,用between函数指定2021年的起止日期:

my_df_new <- my_df %>%
  filter(between(b, as.Date('2021-01-01'), as.Date('2021-12-31')))

如果习惯用你的日期字符串格式,也可以加上format参数:

my_df_new <- my_df %>%
  filter(between(b, as.Date('01-01-21', format = "%d-%m-%y"), as.Date('31-12-21', format = "%d-%m-%y")))

方法三:修正基础R的索引筛选逻辑

同样要保证日期比较时的格式正确性,不能直接用字符串比较:

my_df_new <- my_df[my_df$b > as.Date('31-12-20', format = "%d-%m-%y") & my_df$b < as.Date('01-01-22', format = "%d-%m-%y"), ]

你之前代码失败的原因

  1. 创建b列时未指定format参数,as.Date无法正确解析你的日期字符串,导致b列实际值与预期不符;
  2. 直接用字符串(如"31-12-20")和日期列比较,会按字符顺序而非日期逻辑判断,结果必然错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 12:54:19