R语言实现按月份规则筛选数据:一月保留月初行,其余月份保留月末行
解决方案:按月份条件筛选首日/末日数据
要实现你的需求——筛选2021年1月的首日数据,其他月份的末日数据——我们可以结合dplyr的分组操作和向量化条件判断来完成,以下是具体步骤:
方法一:利用现有Month2列分组筛选
直接使用数据中已有的Month2列进行分组,在每个分组内根据条件筛选对应日期的行:
library(dplyr) # 执行筛选 df_filtered <- df %>% # 按年月分组(Month2已包含完整年月信息) group_by(Month2) %>% # 向量化判断:jan 2021取当月首日,其他月份取当月末日 filter( if_else(Month2 == "jan 2021", Date == min(Date), Date == max(Date)) ) %>% # 取消分组并按日期排序 ungroup() %>% arrange(Date) # 查看结果 df_filtered
运行后会得到你期望的输出:
# A tibble: 5 × 3 Date UPV Month2 <date> <int> <fct> 1 2021-01-01 493 jan 2021 2 2021-02-28 707 feb 2021 3 2021-03-31 688 mrt 2021 4 2021-04-30 1217 apr 2021 5 2021-05-31 1237 mei 2021
方法二:从Date列提取年月(更通用)
如果你的数据没有Month2列,或者想让代码更通用,可以用lubridate包从Date中提取年月信息来分组:
library(dplyr) library(lubridate) df_filtered <- df %>% # 提取年份和月份 mutate( year = year(Date), month = month(Date) ) %>% # 按年和月分组 group_by(year, month) %>% # 条件筛选:2021年1月取首日,其他取末日 filter( if_else(year == 2021 & month == 1, Date == min(Date), Date == max(Date)) ) %>% # 移除临时列并排序 ungroup() %>% select(-year, -month) %>% arrange(Date)
为什么你的之前的代码会报错?
你遇到的错误argument is not interpretable as logical,核心原因是普通if语句是标量判断,无法处理向量条件:
- 第一次尝试中,
str_detect(Month2, "jan")返回的是一个布尔向量(每个元素对应一行的判断结果),但普通if只能接受单个TRUE/FALSE值,所以无法正确执行。 - 第二次尝试中,虽然创建了
JANDECFIX列,但依然用了普通if语句,同样无法处理向量长度的条件;而且没有分组,min(Date)和max(Date)会计算整个数据框的日期极值,而不是每个月份的。
而我们使用的if_else是向量化的条件函数,可以逐行/逐组处理判断,结合group_by后,min(Date)和max(Date)会计算每个分组内的日期极值,正好符合需求。
内容的提问来源于stack exchange,提问作者Justin
相关产品推荐
相关产品推荐

