如何在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)'))
原代码问题
原代码存在两处关键错误:
- 第一步
sub的正则仅匹配单个字符前缀,未覆盖关键词前的所有内容,替换后仍保留后续无关文本; - 第二步
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
相关产品推荐
相关产品推荐

