如何在R语言中实现get_first_name函数提取姓名中的名?
R语言提取姓名中名字的实现思路
核心逻辑
目标字符串格式固定为「姓氏, 名字 中间名」,只需剥离逗号及之前的姓氏部分,保留逗号后的名字(含中间名),再清理掉多余空格即可。
方法1:基础R原生函数实现
无需额外安装包,两种写法可选:
写法A:使用sub正则替换
利用正则表达式匹配逗号及之前的所有内容,替换为空后清理空格:
get_first_name <- function(name) { # 匹配开头到", "的所有内容并移除,再清理首尾空格 trimws(sub("^.*, ", "", name)) }
- 正则
^.*,:^匹配字符串开头,.*匹配任意字符(直到最后一个,),确保精准剥离姓氏部分。 trimws:处理可能存在的前后多余空格。
写法B:使用strsplit分割字符串
按, 分割字符串后提取第二部分:
get_first_name <- function(name) { # 按", "分割每个姓名,提取分割后的第二个元素 sapply(strsplit(name, ", "), function(x) x[2]) }
strsplit将每个姓名拆分为「姓氏」和「名字+中间名」两部分。sapply批量提取每个分割结果的第二个元素。
方法2:使用stringr包(tidyverse生态)
如果常用tidyverse工具链,用stringr的函数更直观:
- 先安装并加载包(首次使用时):
install.packages("stringr") library(stringr)
- 实现函数:
get_first_name <- function(name) { # 移除开头到", "的内容,再清理空格 str_trim(str_remove(name, "^.*, ")) }
str_remove:精准移除匹配正则的部分,逻辑和基础R的sub一致。str_trim:替代trimws,更贴合tidyverse风格。
测试验证
用示例数据测试函数效果:
# 构造测试数据框 d <- data.frame(Full.Name = c("Thompson, Billy Red", "Smith, John Doe", "Lee, Alice")) top.25 <- head(d$Full.Name,25 ) first.25 <- get_first_name(name=top.25 ) # 输出格式化结果 data.frame(top.25, first.25) %>% pander()
输出会得到对应名字列:Billy Red、John Doe、Alice。
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

