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

如何从带干扰信息的字符串中提取R数据框姓名并处理多姓氏?

姓名数据清洗与多姓氏组合提取方案

原始数据

names <- structure(list(name = c('Michael Smith ♕',
                         'Scott Lewis - Realtor',
                         'Erin Hopkins ≈¶',
                         'Katie Parsons | Denver',
                         'Madison Hollins Taylor',
                         'Kevin D. Williams',
                         '|Ryan Farmer|',
                         'l a u r e n   t h o m a s',
                         'Dave Goodwin💦',
                         'Candice Harper Makeup Artist',
                         'dani longfeld // millenialmodels',
                         'Madison Jantzen | DALLAS, TX',
                         'Rachel Wallace Perkins',
                         'Kayla Wright Photography',
                         'Scott Green Jr.')), class = "data.frame", row.names = c(NA, -15L))

需求说明

  • 从每条记录中提取有效姓名,去除特殊符号、职业信息、地域后缀、冗余标记等干扰内容
  • 针对Rachel Wallace Perkins、Madison Hollins Taylor这类多姓氏(或中间名+双姓氏)的情况,生成所有可能的"名+姓"组合

现有方案问题

使用tidyr::extract的正则表达式([^ ]+) (.*)仅能简单拆分首尾,无法过滤干扰内容,也不支持多姓氏组合生成,输出结果不符合预期。

最优处理方案

以下是覆盖多数场景的分步处理代码:

步骤1:清理原始文本,去除干扰项

library(dplyr)
library(stringr)

# 预处理:清理特殊符号、干扰文本,修复空格分隔的拼写
names_clean <- names %>%
  mutate(
    # 移除所有非字母、非空格的字符(保留大小写字母和空格)
    name_clean = str_remove_all(name, "[^A-Za-z ]"),
    # 修复字母间的多余空格(比如"l a u r e n"转为"lauren")
    name_clean = str_replace_all(name_clean, "\\b([A-Za-z])\\s+([A-Za-z])\\b", "\\1\\2"),
    # 移除首尾空格,压缩中间多个空格为单个
    name_clean = str_squish(name_clean),
    # 移除常见后缀(Jr.)、职业/地域关键词
    name_clean = str_remove_all(name_clean, "\\b(Jr\\.|Realtor|Denver|Makeup Artist|millenialmodels|DALLAS, TX|Photography)\\b"),
    # 再次压缩空格
    name_clean = str_squish(name_clean),
    # 首字母大写
    name_clean = str_to_title(name_clean)
  )

步骤2:拆分姓名组件,生成多姓氏组合

# 拆分姓名为单词列表,处理多姓氏情况
names_processed <- names_clean %>%
  mutate(
    name_parts = str_split(name_clean, "\\s+"),
    # 生成所有可能的"名+姓"组合:第一个词是名,后面每个词单独作为姓
    name_combinations = map(name_parts, function(parts) {
      if (length(parts) >= 2) {
        first_name = parts[1]
        last_names = parts[-1]
        paste(first_name, last_names)
      } else {
        parts # 处理极端情况(仅单个词)
      }
    })
  ) %>%
  # 展开组合为单行记录
  unnest(name_combinations) %>%
  # 重命名并保留目标列
  select(name = name_combinations)

最终结果

运行上述代码后,names_processed将与需求示例一致:

# 查看结果
print(names_processed)

输出:

name
1   Michael Smith
2     Scott Lewis
3     Erin Hopkins
4   Katie Parsons
5  Madison Hollins
6   Madison Taylor
7    Kevin Williams
8     Ryan Farmer
9    Lauren Thomas
10    Dave Goodwin
11  Candice Harper
12    Dani Longfeld
13 Madison Jantzen
14  Rachel Wallace
15   Rachel Perkins
16    Kayla Wright
17     Scott Green

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 11:55:18