如何在dplyr的mutate中使用grep?求机构名称提取解决方案
嘿,我来帮你拆解这个提取核心机构名称的问题,用dplyr管道的话其实有好几种实用思路,我会一步步给你讲清每段代码的运行逻辑,再分享几个不同场景下的解决方案~
先准备示例数据
首先咱们用一个贴近真实场景的数据集来演示,方便你对照理解:
library(dplyr) library(stringr) library(purrr) # 模拟科研作者的机构列表 df <- tibble( author_name = c("Alice M. Smith", "Bob K. Johnson", "Charlie Lee"), full_affiliations = c( "Dept of Molecular Biology, Univ. of California, Los Angeles; Inst of Genomics, Stanford Univ.", "School of Mechanical Eng, Univ. of Texas, Austin; Dept of Chemistry, University of Chicago", "Center for Data Science, NYU; Dept of Math, Columbia Univ." ) )
方案1:拆分后筛选匹配项(逻辑最清晰)
这个方案适合你需要先拆分所有机构、再精准筛选的场景,每一步的逻辑都很直观:
df_main_univ <- df %>% # 第一步:把长机构字符串按分号拆成单个机构的列表(\\s*是处理分号后的空格) mutate(affiliation_items = str_split(full_affiliations, ";\\s*")) %>% # 第二步:遍历每个机构列表,筛选出含"univ"关键词的条目(不区分大小写) mutate(univ_matches = map(affiliation_items, ~ str_subset(.x, regex("univ", ignore_case = TRUE)))) %>% # 第三步:提取第一个匹配的机构作为主要机构;没匹配到就返回NA mutate(main_university = map_chr(univ_matches, ~ ifelse(length(.x) > 0, .x[1], NA_character_))) %>% # 清理临时生成的中间列,保持数据整洁 select(-affiliation_items, -univ_matches) # 查看结果 df_main_univ
运行逻辑拆解:
str_split把每个作者的长机构字符串拆成一个列表,每个列表元素是独立的机构名称;map+str_subset遍历每个列表,只保留包含"univ"(不管大小写)的机构;map_chr把列表格式的匹配结果转成字符向量,取第一个匹配项作为主要机构;- 最后用
select删掉临时列,得到干净的结果。
方案2:直接正则提取(最简洁高效)
如果不需要拆分所有机构,只想直接抓出第一个符合"Univ. of XX"格式的机构,用str_extract一步就能搞定:
df_main_univ <- df %>% mutate(main_university = str_extract( full_affiliations, # 正则匹配:Univ.或University开头,后面跟" of ",再匹配到下一个逗号/分号前的内容 regex("(Univ\\.|University) of [^;,]+", ignore_case = TRUE) )) df_main_univ
运行逻辑拆解:
str_extract会从字符串中提取第一个符合正则模式的内容:
(Univ\\.|University)匹配两种常见的大学缩写/全称;[^;,]+表示匹配到下一个逗号或分号就停止,避免把后面的城市、院系也包含进来;ignore_case = TRUE确保不管是大写还是小写的"univ"都能匹配到。
方案3:提取所有匹配的大学(如果需要多个机构)
如果你的需求是提取作者所有关联的大学机构,而不只是第一个,可以用str_extract_all:
df_all_univs <- df %>% mutate(all_universities = str_extract_all( full_affiliations, regex("(Univ\\.|University) of [^;,]+", ignore_case = TRUE) )) %>% # 把列表格式的结果转成逗号分隔的字符串,方便查看 mutate(all_universities_str = map_chr(all_universities, ~ paste(.x, collapse = ", "))) df_all_univs
运行逻辑拆解:
str_extract_all会提取字符串中所有符合正则模式的内容,返回一个列表;之后用map_chr + paste把列表转成可读性更强的逗号分隔字符串。
内容的提问来源于stack exchange,提问作者Kamil
相关产品推荐
相关产品推荐

