如何在R中用separate_rows拆分无分隔符姓名字符串(含无头衔姓名)
解决R中使用separate_rows拆分无分隔符的姓名(含头衔/无头衔)
要处理这种没有明确分隔符但有固定头衔的姓名拆分,核心思路是先给头衔添加统一的分隔符,再用separate_rows拆分。具体步骤如下:
- 先把你的矩阵转成数据框(
cbind生成的矩阵处理字符串不太方便),加载需要的包:
library(tidyr) library(stringr) # 原数据转成数据框 a <- c(1) b <- ("Mr Mark Brown Ms Olivia Brown Mrs Alex Tyrwitt Bryan Fox Dr Somebody Something") ab <- data.frame(a, b, stringsAsFactors = FALSE)
- 用正则匹配所有头衔(
Mr/Ms/Mrs/Dr),在每个头衔前插入分隔符(比如分号;),注意跳过第一个头衔前的位置:
# 给非开头的头衔前加分号作为分隔符 ab$b <- str_replace_all(ab$b, "(?<!^)\\b(Mr|Ms|Mrs|Dr)\\b", ";\\1")
这里的正则(?<!^)\\b(Mr|Ms|Mrs|Dr)\\b表示:匹配不在字符串开头的、独立的头衔单词,然后替换成;+头衔,这样就给每个姓名之间加上了明确的分隔符。
- 用
separate_rows拆分,并清理多余空格:
# 按分号拆分行 result <- separate_rows(ab, b, sep = ";") # 去除字符串前后和中间的多余空格 result$b <- str_squish(result$b)
最终得到的结果如下:
a b 1 1 Mr Mark Brown 2 1 Ms Olivia Brown 3 1 Mrs Alex Tyrwitt 4 1 Bryan Fox 5 1 Dr Somebody Something
如果有其他需要匹配的头衔(比如Miss/Prof),只需要扩展正则里的列表即可,比如(Mr|Ms|Mrs|Dr|Miss|Prof)。
内容的提问来源于stack exchange,提问作者Y_gr
相关产品推荐
相关产品推荐

