R语言如何按大小写规则拆分姓名字符串为姓氏和名字向量
R语言拆分固定格式姓名字符串的实现方法
需求说明
现有存储姓名的字符向量,格式规则固定:
- 姓氏部分全部为大写字母,部分复姓内部包含空格
- 名字部分仅首字母大写,其余字母均为小写
需要将每个姓名拆分为两个独立向量:全大写的姓氏向量、对应的名字向量。
示例输入
names <- c("BIDEN Joe", "DE WEERDT Jan", "SCHEPERS Caro")
预期输出
- 姓氏向量:
surnames <- c("BIDEN", "DE WEERDT", "SCHEPERS")
- 名字向量:
first_names <- c("Joe", "Jan", "Caro")
实现方案
核心逻辑:利用名字的格式特征——名字永远是字符串最末端、首字母大写后续全小写的片段,不需要提前判断姓氏包含几个单词,直接通过正则匹配即可精准拆分,适配多空格复姓场景。
方法1:Base R 原生实现(无需安装加载第三方包)
直接用基础R的正则替换函数完成拆分:
# 提取末尾的名字片段 first_names <- sub(".* ([A-Z][a-z]+)$", "\\1", names) # 移除末尾的名字片段,去除多余空格得到姓氏 surnames <- trimws(sub(" [A-Z][a-z]+$", "", names))
运行结果校验:
> surnames [1] "BIDEN" "DE WEERDT" "SCHEPERS" > first_names [1] "Joe" "Jan" "Caro"
和预期结果完全匹配,即便是包含多段空格的复姓(例如"VAN DER SAR Edwin")也能正确识别拆分。
方法2:stringr 包实现(tidyverse 生态友好写法)
如果日常使用tidyverse系列工具,可以用stringr的函数实现,逻辑和原生方法一致,代码可读性更强:
library(stringr) # 提取末尾符合名字规则的片段 first_names <- str_extract(names, "[A-Z][a-z]+$") # 移除名字片段后去除多余空格得到姓氏 surnames <- str_trim(str_remove(names, " [A-Z][a-z]+$"))
内容的提问来源于stack exchange,提问作者JoGa
相关产品推荐
相关产品推荐

