R语言如何更简便地用grepl跨多列匹配多个年份筛选目标变量
优化实现方案
你只需要通过all()函数判断所有年份匹配结果均为真即可,完全不需要两次循环,以下是几个不同实现版本:
1. 基于原有逻辑的最简优化版
仅修改判断逻辑,保留你熟悉的写法:
library(dplyr) year_filter_test <- function(data, years) { data2 <- data %>% mutate(search_columns = paste(x1970, x1980, x1990, x2000)) %>% # 直接过滤所有年份都匹配的行 filter(sapply(search_columns, function(x) all(grepl(years, x)))) return(data2) }
2. 通用增强版
自动识别所有年份列(无需手动写死列名),后续新增年份列不用改函数:
library(dplyr) year_filter <- function(data, years) { data %>% rowwise() %>% # 自动选中所有x开头的年份列拼接 mutate(search_columns = paste(across(starts_with("x")), collapse = " ")) %>% # 判断所有年份都存在 filter(all(grepl(years, search_columns))) %>% ungroup() }
3. 纯Base R版本
不需要加载任何第三方包:
year_filter_base <- function(data, years) { # 自动提取所有x开头的年份列拼接为搜索列 search_col <- do.call(paste, data[, grep("^x", colnames(data))]) # 筛选所有年份都匹配的行 match_rows <- sapply(search_col, function(s) all(grepl(years, s))) return(data[match_rows, ]) }
测试效果
传入参数c("70", "90")测试,三个版本都可以返回正确结果:
| item | x1970 | x1980 | x1990 | x2000 |
|---|---|---|---|---|
| ABC | abc70 | abc80 | abc90 | |
| DEF | 70def | 80def | 90def | 00def |
| PQR | 70pqr | 80pqr | 90pqr | 00pqr |
内容的提问来源于stack exchange,提问作者MTW
相关产品推荐
相关产品推荐

