如何用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
相关产品推荐
相关产品推荐

