You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 14:06:29