You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

运行逻辑拆解:

  1. str_split把每个作者的长机构字符串拆成一个列表,每个列表元素是独立的机构名称;
  2. map + str_subset遍历每个列表,只保留包含"univ"(不管大小写)的机构;
  3. map_chr把列表格式的匹配结果转成字符向量,取第一个匹配项作为主要机构;
  4. 最后用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:55:14