如何在R语言中提取带前缀姓名的名(First Name)
提取带前缀姓名中的名(First Name)
针对你给出的姓名数据,这里提供几种在R中简便提取名的方法:
首先构造测试数据:
names <- c("Tom", "Tom Turner", "Dr. Tom Turner", "R. Tom Turner", "J Tom Turner", "Jr. Tom Turner")
方法一:使用stringr包(tidyverse生态)
利用正则替换去掉前缀,再提取第一个单词:
library(stringr) # 定义需要匹配的前缀模式:涵盖Dr.、Jr.、单个大写字母(可带点)加空格 prefix_pattern <- "^(Dr\\.|Jr\\.|[A-Z]\\.?\\s)" # 移除开头的前缀 cleaned_names <- str_replace(names, prefix_pattern, "") # 提取第一个单词作为名 first_names <- word(cleaned_names, 1)
运行后first_names结果为:c("Tom", "Tom", "Tom", "Tom", "Tom", "Tom"),符合需求。
如果有其他前缀(如Mr.、Ms.、Prof.),只需扩展prefix_pattern即可,比如:
prefix_pattern <- "^(Dr\\.|Jr\\.|Mr\\.|Ms\\.|Prof\\.|[A-Z]\\.?\\s)"
方法二:Base R原生实现
无需额外包,用gsub和strsplit完成:
# 移除前缀 cleaned_names <- gsub("^(Dr\\.|Jr\\.|[A-Z]\\.?\\s)", "", names) # 拆分字符串并取第一个元素 first_names <- sapply(strsplit(cleaned_names, "\\s+"), `[`, 1)
方法三:直接正则提取
用str_extract直接匹配目标名,无需先替换:
library(stringr) first_names <- str_extract(names, "(?:^(?!Dr\\.|Jr\\.|[A-Z]\\.?\\s)[A-Z][a-z]+)|(?<=^(Dr\\.|Jr\\.|[A-Z]\\.?\\s))[A-Z][a-z]+")
注意事项
- 上述正则默认匹配英文姓名的常规前缀,若有特殊前缀(如"Rev."),只需在模式中添加对应的规则即可。
- 如果姓名包含中间名(如"Dr. Tom Michael Turner"),上述方法依然会正确提取第一个名(Tom)。
内容的提问来源于stack exchange,提问作者Swaroop Poudel
相关产品推荐
相关产品推荐

