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

如何在R语言中移除姓名列的中间名/缩写并保存至新列?

处理姓名列中的中间名:拆分并分别存储

我有一个名为fullname的姓名列,其中部分姓名包含中间名或中间名缩写。需要从该列移除这些中间名/缩写,同时创建新列专门存储这些中间名/缩写。我查过相关移除中间名的方案,但不知道如何把提取出的中间名转移到新列里。

以下是用dput()生成的40行数据样本,我的原始数据有4300万行,约3.8GB:

data <- structure(list(id = c(439116595, 439317458, 439373574, 439434694, 
439508848, 439632143, 439778306, 439917155, 440009485, 440147556, 
440207880, 441479247, 442115059, 441569787, 438192228, 438215998, 
438307365, 438317476, 438389110, 438409963, 438479736, 438509859, 
438634859, 438662407, 438764944, 438846700, 438884094, 438954147, 
439227370, 439243020, 439248564, 439272667, 439357884, 439403127, 
439446363, 439511276, 439546441, 439586141, 439804213, 439862550, 
439889286), fullname = c("Shawn Chase", "Steven Hofer", "Stephen Paradise", 
"Shengho Yang", "Nelson Carvalho", "RICK GILLICK", "Marie Jhoanne Morilla", 
"Sanjay Kulkarni", "Sam Bunn", "Iran Murphy", "Kathryn Cutler", 
"Diane Sik", "Donna Yee", "Christine Coltrain", "Maher Dakkouri", 
"Ray Perl", "Abid Khalil", "Ian Crombie", "Allen Carr", "Daniel Angeline", 
"Jimmy Tan", "Thierry LAMBERT", "Diene Faye", "Greg Greene", 
"Laura Holsopple", "Roberta Minkus", "Bridget Chenette", "Joshua Polite", 
"John Liberty", "David Smith", "Igor Baratta", "Pierre Schmitz", 
"alejandra salvanes", "Malcolm K Knight", "Xiaoyan Hu", "Joe Pawl", 
"Bryan Armstrong", "Christina Spezio", "Robert Gibson", "Peter Head", 
"Mike Russo"), degree = c("Bachelor", "Bachelor", "MBA", 
"", "", "", "", "Master", "", "MBA", "", "", "Bachelor", "Doctor", 
"Bachelor", "Master", "Master", "", "", "", "", "", "", "Bachelor", 
"Master", "", "Master", "", "Bachelor", "Master", "", "", "", 
"", "Bachelor", "Associate", "", "Bachelor", "", "", "Associate"
)), row.names = 20:60, class = "data.frame")

我在小数据集上尝试了以下代码,但出现警告:

Warning message:
In stri_match_first_regex(string, pattern, opts_regex = opts(pattern)) : argument is not an atomic vector; coercing

str_match(data, '^(\\S+)\\s*(.*?)\\s*(\\S+)$')[,-1]

解决方案

在@Ben Bolker的帮助下修改了上述方法,运行速度非常快!它可以处理包含多个中间名的特殊情况,完全符合需求:

names <- stringr::str_match(data$fullname, '^(\\S+)\\s*(.*?)\\s*(\\S+)$')[,-1]  
names <- data.frame(no_mid_name = paste(names[,1], names[,3]),
                   mid_name = names[,2])

之后使用cbind()将生成的列添加到原始数据集中。


内容的提问来源于stack exchange,提问作者bear_525

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 05:14:54