如何在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"), ]
你之前代码失败的原因
- 创建
b列时未指定format参数,as.Date无法正确解析你的日期字符串,导致b列实际值与预期不符; - 直接用字符串(如
"31-12-20")和日期列比较,会按字符顺序而非日期逻辑判断,结果必然错误。
内容的提问来源于stack exchange,提问作者Tuesday2019
相关产品推荐
相关产品推荐

