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

R语言如何删除data frame中不包含2014-2021年份的对应行

筛选2014-2021年覆盖行的解决方案

你可以直接用正则匹配结合grepl()实现需求,这也是你之前尝试的思路的正确写法:

方法1:base R正则匹配(适配你原本的grep使用思路)

# 构造示例数据
df <- structure(list(`Legislative period` = c("2004/02/02 - 2019/08/13", 
"1993/03/11 - 2004/02/01", "2014/07/09 - ", "2021/09/27 - ", 
"2021/07/29 - 2021/09/26", "2013/01/25 - "), Party = c("Conservative Party of Canada ", 
"Progressive Conservative Party ", "Conservative Party of Canada ", 
"Independent Senators Group ", "Non-affiliated ", "Conservative Party of Canada "
)), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame"
))

# 筛选逻辑:只要会期字符串中包含2014-2021任意年份的行就保留
df_filtered <- df[grepl("201[4-9]|202[01]", df$`Legislative period`), ]

正则说明:201[4-9]匹配2014到2019年份,202[01]匹配2020、2021年份,只要字段里出现任意一个就命中筛选条件。

方法2:日期格式严谨处理(适合后续需要做日期计算的场景)

如果需要更严谨的日期区间逻辑判断(比如判断会期和2014-2021区间是否有重叠,而非单纯匹配年份字符串),可以用lubridate处理:

library(dplyr)
library(lubridate)
library(stringr)

df_filtered <- df %>%
  # 拆分起止日期
  mutate(
    start_date = ymd(str_split_i(`Legislative period`, " - ", 1)),
    end_date = ymd(str_split_i(`Legislative period`, " - ", 2)),
    # 未填写结束日期的默认按仍在任处理
    end_date = replace(end_date, is.na(end_date), ymd("9999-12-31"))
  ) %>%
  # 筛选和2014-2021区间存在重叠的行
  filter(start_date <= ymd("2021-12-31") & end_date >= ymd("2014-01-01")) %>%
  select(-start_date, -end_date)

如果你的需求是筛选整个会期完全落在2014-2021之间的行,把上面filter里的条件改成start_date >= ymd("2014-01-01") & end_date <= ymd("2021-12-31")即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 03:45:07