如何在R中使用列表元素作为变量和grepl匹配模式,通过for/foreach循环实现?
R 循环实现动态变量创建与匹配的方案
基础 for 循环实现(最简便,推荐)
直接用R内置的assign()函数实现动态变量赋值,无需额外加载包:
# 遍历你定义的元素列表 for (pattern in E.list) { # 创建对应模式的df子集变量 assign(pattern, df[, grepl(pattern, names(df))]) # 创建对应模式的Meta过滤子集变量 assign(paste0(pattern, "_META"), dplyr::filter(Meta, grepl(pattern, CASE_Name))) }
代码说明
assign(变量名字符串, 要赋值的内容)是R原生的动态赋值函数,刚好满足你用列表元素当变量名的需求paste0(pattern, "_META)用来拼接出带_META后缀的变量名- 如果你的模式字符串包含
.+*等正则特殊字符,想做精确字面匹配,可以给grepl加fixed = TRUE参数:grepl(pattern, names(df), fixed = TRUE)
更规范的替代方案(不污染全局环境)
如果不想生成太多零散的全局变量,可以把所有结果存在同一个列表里,后续取用更整洁:
result <- list() for (pattern in E.list) { result[[pattern]] <- df[, grepl(pattern, names(df))] result[[paste0(pattern, "_META")]] <- dplyr::filter(Meta, grepl(pattern, CASE_Name)) } # 后续取用示例 result$ELP result$ELP_META
foreach 循环实现
如果需要配合并行场景使用foreach,需要指定赋值的环境为全局环境,否则变量只会在循环局部生效:
library(foreach) foreach(pattern = E.list) %do% { assign(pattern, df[, grepl(pattern, names(df))], envir = .GlobalEnv) assign(paste0(pattern, "_META"), dplyr::filter(Meta, grepl(pattern, CASE_Name)), envir = .GlobalEnv) }
如果要开并行的话把%do%改成%dopar%,提前配置好并行集群即可。
内容的提问来源于stack exchange,提问作者Mendel
相关产品推荐
相关产品推荐

