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

如何在R语言中提取"Administering Provider"后的姓名子字符串?

问题解决:提取Administering Provider后的人名

需求

从文本中提取“Administering Provider”之后的人名(可包含名、中间名、姓),忽略人名后的头衔(如R.N.)及后续无关内容。

给定数据框

df <- data.frame("id"= c(12, 19, 20), 'comments' = c('APK COMMENTS FOR APK LOG ID (145991): APK ADMINISTERING PROVIDER: LAURA ABE LE\rAPK ORDERING PROVIDER: EMMA COURTIER (CMS:19928)',
                                               'APK LOG ID (45664705): APK Administering Provider: CHASITY MCDANIELS (1972609856:0000034)\rAPK ORDERING PROVIDER: PAUL LAMAR (19785663:19928476)',
                                               'APK ADMINISTERING PROVIDER: JOHN DOE, R.N. (EPIC:107080)\rAPK ORDERING PROVIDER: OHM LOHAN (EPIC:1987)'))

原代码问题

原代码存在两处关键错误:

  1. 第一步sub的正则仅匹配单个字符前缀,未覆盖关键词前的所有内容,替换后仍保留后续无关文本;
  2. 第二步gsub错误使用原comments列而非处理后的name列,前序替换完全无效,同时未处理人名后的头衔。

解决方案

方法1:使用tidyverse的stringr包(更直观)

library(tidyverse)

updated.df <- df %>%
  mutate(
    administering_provider = str_extract(comments, 
                                        "(?i)administering provider:\\s*([A-Za-z ]+?)(?:,?\\s*[A-Z.]+\\.?|(?=\\s*\\(|APK))") %>%
      str_remove("(?i)administering provider:\\s*") %>%
      trimws()
  )

方法2:Base R一步完成

updated.df <- df %>%
  mutate(
    administering_provider = trimws(sub("(?i).*administering provider:\\s*([A-Za-z ]+?)(?:,?\\s*[A-Z.]+\\.?|\\s*\\(|APK).*", "\\1", comments))
  )

结果说明

处理后administering_provider列将得到:

  • 12号id:LAURA ABE LE
  • 19号id:CHASITY MCDANIELS
  • 20号id:JOHN DOE

完全符合提取人名、忽略头衔及后续内容的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 11:15:01