如何保留DataFrame中含无月份年份格式的行?
筛选包含无月份年份格式的DataFrame行
场景说明
现有如下R语言DataFrame:
df <- data.frame( id = c(1,2,3), date1 = c("2014-Dec 2018","2009-2010","Jan 2009-Aug 2010"), date2 = c("Feb 2016-Dec 2018","2014-Dec 2018","Oct 2013-Dec 2018") )
需要保留**任意列中存在无月份的纯年份(月份为3字母格式,如Jan/Dec)**的行,最终排除所有日期串均带3字母月份前缀的行(如id=3的行)。
解决方案
通过正则表达式匹配无月份前缀的年份,结合行级筛选实现需求:
1. 定义匹配规则
使用负向后瞻正则,确保匹配的4位年份前没有"3字母月份+空格"的前缀:
pattern <- "(^|(?<![A-Z][a-z]{2} ))\\d{4}(-|$)"
2. Base R 实现
# 对每行的date1/date2列检查是否存在匹配项 filtered_df <- df[apply(df[, c("date1", "date2")], 1, function(x) any(grepl(pattern, x, perl = TRUE))), ] # 查看结果 filtered_df
3. dplyr 实现(更简洁)
library(dplyr) filtered_df <- df %>% rowwise() %>% filter(any(grepl(pattern, c(date1, date2), perl = TRUE))) %>% ungroup()
输出结果
id date1 date2 1 1 2014-Dec 2018 Feb 2016-Dec 2018 2 2 2009-2010 2014-Dec 2018
内容的提问来源于stack exchange,提问作者Erik Brole
相关产品推荐
相关产品推荐

