R语言去除数据框字符串内重复驼峰命名机构名称的更优雅实现方案
R机构名称去重+驼峰拆分优化解法
核心优化思路
原方案通过生成多列中间变量判断重复,可直接用正则表达式的零宽断言和捕获组功能,2行核心代码完成需求,同时适配带后缀的场景。
完整实现代码
依赖包
只需要用到stringr和dplyr,习惯用基础R也可换成gsub实现同等逻辑。
library(stringr) library(dplyr)
基础场景解法(无后缀)
# 构造测试数据 df <- data.frame( id=1:4, org=c("Alpha Company", "Bravo InstituteBravo Institute", "Charlie Group", "Delta IncorporatedDelta Incorporated") ) # 清洗逻辑 df_clean <- df %>% mutate( # 拆分驼峰:仅在小写字母接大写字母的位置插入空格,不破坏原有正常格式 org_split = str_replace_all(org, "(?<=[a-z])(?=[A-Z])", " "), # 去重复:如果整个字符串是相同内容重复两次,直接替换为单次内容 org_fix = str_replace(org_split, "^(.+)\\1$", "\\1") ) %>% # 保留需要的列 select(id, org = org_fix)
附加场景解法(适配, LLC等后缀)
上述代码完全兼容带后缀的场景,不需要修改逻辑,直接运行即可:
# 构造带后缀的测试数据 df2 <- data.frame( id=1:4, org=c("Alpha Company, LLC", "Bravo InstituteBravo Institute", "Charlie Group", "Delta IncorporatedDelta Incorporated") ) # 复用同样的清洗逻辑 df2_clean <- df2 %>% mutate( org_split = str_replace_all(org, "(?<=[a-z])(?=[A-Z])", " "), org_fix = str_replace(org_split, "^(.+)\\1$", "\\1") ) %>% select(id, org = org_fix)
逻辑说明
- 驼峰拆分逻辑:用零宽断言
(?<=[a-z])(?=[A-Z])匹配小写字母和大写字母的交界位置插入空格,不会修改, LLC这类后缀里的大写字母,解决了原有gsub误加空格的问题。 - 去重逻辑:用正则
^(.+)\\1$直接匹配「整个字符串由相同内容连续重复两次组成」的情况,用捕获组直接提取单次内容,不需要额外生成中间列判断重复,代码更精简高效。
内容的提问来源于stack exchange,提问作者Shawn Janzen
相关产品推荐
相关产品推荐

