在R语言中将姓名从‘姓氏 名字’格式转换为‘名字首字母. 姓氏’
解决R语言姓名格式转换问题
问题核心
你的姓名数据有明确格式:姓氏为全大写单词(支持多姓氏、连字符),名字为首字母大写的单词(支持多名字),目标是提取名字的首字母,拼接回姓氏前,格式为首字母. 姓氏。原函数的错误在于搞反了姓氏和名字的位置,且未利用数据的大小写特征来准确区分二者。
修正后的函数
library(stringr) convert_name <- function(name) { # 拆分姓名为单个单词 name_parts <- str_split(name, " ")[[1]] # 用大小写区分姓氏(全大写含连字符)和名字(非全大写) surname <- paste(name_parts[str_detect(name_parts, "^[A-Z-]+$")], collapse = " ") given_initial <- str_to_upper(str_sub(name_parts[!str_detect(name_parts, "^[A-Z-]+$")][1], 1, 1)) # 组合成目标格式 paste0(given_initial, ". ", surname) }
验证效果
将你的姓名列表传入函数测试:
names <- c("CASEY Aoife", "CREMEN Margaret", "MORCH-PEDERSEN Marie", "RORVIK Jenny Marie", "MIGUEL GOMES Natalia", "ROHNER Maria-Clara") sapply(names, convert_name)
输出结果完全符合需求:
CASEY Aoife CREMEN Margaret MORCH-PEDERSEN Marie "A. CASEY" "M. CREMEN" "M. MORCH-PEDERSEN" RORVIK Jenny Marie MIGUEL GOMES Natalia ROHNER Maria-Clara "J. RORVIK" "N. MIGUEL GOMES" "M. ROHNER"
关键处理说明
- 多姓氏/连字符姓氏:通过正则
^[A-Z-]+$匹配全大写含连字符的单词,拼接后保留原格式 - 多名字:取名字部分的第一个单词首字母,符合目标输出要求
- 鲁棒性:依赖数据本身的大小写特征区分姓氏和名字,比单纯按位置拆分更准确
内容的提问来源于stack exchange,提问作者emily20wood
相关产品推荐
相关产品推荐

