如何不使用separate和pivot_longer函数实现站点名称匹配赋值?
简化R代码实现站点名称匹配分配
需求:根据预设匹配规则为每条记录分配对应的SiteName,原代码使用了separate和pivot_longer函数,以下是无需这两个函数的简洁实现方案。
原始数据
df <- tibble::tribble( ~Author, ~"Author Address", "BA", "METRO NORTH; DALLAS", "OA", "RBWH; TPCH; TOPEND", "OB", "CABOOLTURE HOSPITAL; CALIFORNIA UNI", "AOS", "CABOOLTURE HOSPITAL; RBWH", "KB", "WOMENS HOSPITAL" )
简化实现代码
library(dplyr) library(stringr) # 定义匹配规则字典,键为匹配关键词,值为对应SiteName site_map <- c( "METRO NORTH" = "Metro North Health", "CABOOLTURE HOSPITAL" = "Caboolture Hospital", "TPCH" = "Prince charles hospital", "RBWH" = "RBWH" ) df %>% mutate( # 保留原始地址至Address列 Address = `Author Address`, # 拆分地址、清洗空格、匹配站点并合并结果 Site = map_chr(str_split(`Author Address`, ";"), function(sites) { sites_trimmed <- str_trim(sites) # 匹配符合规则的站点 matched_sites <- site_map[match(sites_trimmed, names(site_map))] # 过滤未匹配项,用逗号拼接有效结果 paste(na.omit(matched_sites), collapse = ", ") }) ) %>% select(Author, Address, Site)
代码说明
- 规则字典化:将匹配规则定义为命名向量,比
case_when更直观,后续维护规则更便捷 - 单行闭环处理:通过
str_split拆分地址为列表,直接在每行内完成站点匹配、过滤与合并,无需宽表转长表再聚合的步骤 - 自动清洗过滤:用
str_trim处理拆分后地址的空格问题,na.omit自动剔除无法匹配的地址项,省去手动清理NA的操作
输出结果
| Author | Address | Site |
|---|---|---|
| BA | METRO NORTH; DALLAS | Metro North Health |
| OA | RBWH; TPCH; TOPEND | RBWH, Prince charles hospital |
| OB | CABOOLTURE HOSPITAL; CALIFORNIA UNI | Caboolture Hospital |
| AOS | CABOOLTURE HOSPITAL; RBWH | Caboolture Hospital, RBWH |
| KB | WOMENS HOSPITAL |
内容的提问来源于stack exchange,提问作者Banji
相关产品推荐
相关产品推荐

