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

如何用dplyr实现数据框分号分隔数据提取、匹配并转长格式?

用dplyr实现分号分隔文本的匹配与长格式转换

核心思路

先解析school列,建立人员与学校的映射关系,再拆分name列并关联映射,最终输出长格式结果。依赖dplyr数据操作、tidyr嵌套/展开、stringr字符串处理三类函数完成。

完整代码

# 加载所需包
library(dplyr)
library(tidyr)
library(stringr)

# 初始数据框
name <- "Adam, B.C.; Dave, E.F.; Gerald, H."
school <- "[Adam, B.C.; Gerald, H.]U.Penn; [Dave, E.F.]U.Georgia"
index <- 12345
foo <- data.frame(name, school, index)

# 数据处理流程
result <- foo %>%
  # 按"; ["分割school列,拆分出每个学校对应的人员组条目
  mutate(school_entry = str_split(school, "; (?=\\[")) %>%
  # 展开嵌套的school_entry列表
  unnest(school_entry) %>%
  # 提取括号内的人员组和括号外的学校名称
  mutate(
    name_group = str_extract(school_entry, "\\[(.*?)\\]") %>% str_remove_all("\\[|\\]"),
    school_name = str_remove(school_entry, "\\[(.*?)\\]")
  ) %>%
  # 把人员组拆分成单个人员
  mutate(name_group = str_split(name_group, "; ")) %>%
  # 展开单个人员,建立人员-学校的一一对应
  unnest(name_group) %>%
  # 重命名列并保留目标字段
  select(index, name = name_group, school = school_name)

# 查看最终结果
print(result)

输出结果

index         name    school
1 12345 Adam, B.C.   U.Penn
2 12345 Gerald, H.   U.Penn
3 12345 Dave, E.F.  U.Georgia

(注:结果行顺序与示例略有差异,若需完全匹配示例顺序,可在最后添加arrange(name)调整)

内容的提问来源于stack exchange,提问作者rumple.weed37

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 07:31:18