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

如何不使用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)

代码说明

  1. 规则字典化:将匹配规则定义为命名向量,比case_when更直观,后续维护规则更便捷
  2. 单行闭环处理:通过str_split拆分地址为列表,直接在每行内完成站点匹配、过滤与合并,无需宽表转长表再聚合的步骤
  3. 自动清洗过滤:用str_trim处理拆分后地址的空格问题,na.omit自动剔除无法匹配的地址项,省去手动清理NA的操作

输出结果

AuthorAddressSite
BAMETRO NORTH; DALLASMetro North Health
OARBWH; TPCH; TOPENDRBWH, Prince charles hospital
OBCABOOLTURE HOSPITAL; CALIFORNIA UNICaboolture Hospital
AOSCABOOLTURE HOSPITAL; RBWHCaboolture Hospital, RBWH
KBWOMENS HOSPITAL

内容的提问来源于stack exchange,提问作者Banji

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 20:50:29