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

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语句是标量判断,无法处理向量条件:

  1. 第一次尝试中,str_detect(Month2, "jan")返回的是一个布尔向量(每个元素对应一行的判断结果),但普通if只能接受单个TRUE/FALSE值,所以无法正确执行。
  2. 第二次尝试中,虽然创建了JANDECFIX列,但依然用了普通if语句,同样无法处理向量长度的条件;而且没有分组,min(Date)和max(Date)会计算整个数据框的日期极值,而不是每个月份的。

而我们使用的if_else是向量化的条件函数,可以逐行/逐组处理判断,结合group_by后,min(Date)和max(Date)会计算每个分组内的日期极值,正好符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 19:42:36