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
相关产品推荐
相关产品推荐

