如何在R中基于数据框的topic自动生成命名正则变量?
动态生成基于Topic的正则表达式变量
问题说明
给定如下包含topic和keyword列的数据框:
| topic | keyword |
|---|---|
| cheese | cheddar |
| meat | beef |
| meat | chicken |
| cheese | swiss |
| bread | focaccia |
| bread | sourdough |
| cheese | gouda |
需要基于每个topic自动生成对应的正则表达式变量(变量名格式为[topic]_regex),无需手动逐个调用函数生成。当前已有手动生成的函数:
fn_get_topic_regex <- function(targettopic,df) { filter_df <- df |> filter(topic == targettopic) regex <- paste(filter_df$keyword, collapse = "|") }
期望自动生成的变量及对应值:
cheese_regex: "cheddar|swiss|gouda" bread_regex: "focaccia|sourdough" meat_regex: "beef|chicken"
最佳实现方法
1. 用命名列表存储(推荐)
在R中,不建议随意生成全局变量,用命名列表统一管理所有正则表达式更规范,也便于后续调用和维护:
library(dplyr) # 按topic分组拼接正则表达式,转换为命名列表 regex_list <- df |> group_by(topic) |> summarise(regex = paste(keyword, collapse = "|"), .groups = "drop") |> tibble::deframe()
调用示例:
# 获取cheese对应的正则表达式 regex_list[["cheese"]] # 输出:"cheddar|swiss|gouda" # 获取bread对应的正则表达式 regex_list[["bread"]] # 输出:"focaccia|sourdough"
2. 动态生成全局变量(按需使用)
如果业务场景必须生成独立的全局变量,可以通过assign()函数配合循环实现:
library(dplyr) # 获取所有唯一的topic值 unique_topics <- unique(df$topic) # 循环生成对应变量 for (topic in unique_topics) { # 构造变量名:topic + "_regex" var_name <- paste0(topic, "_regex") # 拼接当前topic的正则表达式 regex_str <- df |> filter(topic == !!topic) |> pull(keyword) |> paste(collapse = "|") # 将变量存入全局环境 assign(var_name, regex_str, envir = .GlobalEnv) }
执行后,全局环境中会自动生成cheese_regex、bread_regex、meat_regex三个变量,直接调用即可得到对应正则表达式。
内容的提问来源于stack exchange,提问作者Christopher Penn
相关产品推荐
相关产品推荐

