如何修改含str_detect的R脚本实现多机构数据处理及对象命名自动化
实现方案
你可以通过「封装自定义函数+批量遍历机构列表」的方式实现全流程自动化,具体实现代码如下:
步骤1:封装统一处理逻辑为自定义函数
把机构名称作为入参,相同的处理逻辑复用,示例代码:
# 自定义处理函数,入参org_name为collectionName要匹配的机构全称 process_org <- function(org_name) { df %>% filter(str_detect(collectionName, org_name)) %>% filter(str_detect(Year, paste(years, collapse = "|"))) %>% corpus(text_field = "text") %>% tokens(remove_punct = TRUE) %>% tokens_select(stopwords('english'),selection='remove') %>% tokens_tolower(keep_acronyms = FALSE) %>% tokens_lookup(dictionary = dict, nomatch = TRUE) %>% dfm() %>% dfm_group(groups = "Title") %>% dfm_weight(scheme = "prop") %>% as.data.frame() %>% # 原mutate_at+funs写法已过时,替换为更稳定的across写法,兼容最新版dplyr mutate(across(c(keyterms, true), ~round(., 4))) }
如果你仍在使用旧版dplyr,可以把最后一行替换回你原来的mutate_at(vars(keyterms, true), funs(round(., 4)))即可。
步骤2:批量生成对应机构的结果对象
你可以先定义机构和对应对象名的映射列表,再通过遍历自动生成所有机构的结果:
# 定义机构映射:键为要生成的对象名,值为collectionName中匹配的机构全称 org_map <- c( orgx = "Organization X", orgy = "Organization Y", orgz = "Organization Z" # 后续新增机构直接在这里加条目即可 ) # 批量执行处理,将结果赋值到全局环境 purrr::iwalk(org_map, ~assign(.y, process_org(.x), envir = .GlobalEnv))
执行完成后,你就可以直接调用orgx/orgy/orgz等对应机构的结果对象,和你原来手动生成的效果完全一致。
可选优化建议
- 如果是精确匹配机构名称,建议把
filter(str_detect(collectionName, org_name))替换为filter(collectionName == org_name),避免部分机构名称重叠导致的误匹配,同时查询效率更高 - 如果你不想生成太多独立对象污染全局环境,可以把结果存在一个统一的命名列表中,后续用
org_result$orgx的方式调用即可,代码调整为:
org_result <- purrr::map(org_map, process_org)
内容的提问来源于stack exchange,提问作者J.Doe
相关产品推荐
相关产品推荐

