首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除字符串元素中重复的名称(短语)的一种更优雅的方法

删除字符串元素中重复的名称(短语)的一种更优雅的方法
EN

Stack Overflow用户
提问于 2021-12-02 09:06:14
回答 3查看 61关注 0票数 0

我在dataframe中有一个组织名称向量。其中一些很好,另一些则在同一个元素中重复了两次。而且,当该名称被重复时,没有分隔空间,因此名称具有camelCase外观。

例如(为一般数据引用添加的id列):

1阿尔法连

2布拉沃InstituteBravo研究所

3查理集团

德尔塔IncorporatedDelta公司

但看起来应该是:

1阿尔法连

2布拉沃研究所

3查理集团

4德尔塔公司

我有一个解决方案,得到我需要的结果--下面是可重复的示例代码。然而,它似乎有点长,不太优雅。

对于同样的结果,有谁有更好的方法吗?

额外的问题:如果组织中包含“type”,比如Alpha Company,LLC,那么我修复camelCase的gsub()行也不起作用。对于如何调整camelCase补丁以解释",LLC“,以及如何处理其余的解决方案,有什么建议吗?

提前感谢!(多亏了OP &那些在上提供帮助的人)

代码语言:javascript
复制
# packages
library(stringr)
# toy data
df <- data.frame(id=1:4, org=c("Alpha Company", "Bravo InstituteBravo Institute", "Charlie Group", "Delta IncorporatedDelta Incorporated"))
# split up & clean camelCase words
df$org_fix <- gsub("([A-Z])", " \\1", df$org)
df$org_fix <- str_trim(str_squish(df$org_fix))
# temp vector with half the org names
df$org_half <- word(df$org_fix, start=1, end=(sapply(strsplit(df$org_fix, " "), length)/2)) # stringr::word
# double the temp vector
df$org_dbl <- paste(df$org_half, df$org_half)
# flag TRUE for orgs that contain duplicates in name
df$org_dup <- df$org_fix == df$org_dbl
# corrected the org names
df$org_fix <- ifelse(df$org_dup, df$org_half, df$org_fix)
# drop excess columns
df <- df[,c("id", "org_fix")]

# toy data for the bonus question
df2 <- data.frame(id=1:4, org=c("Alpha Company, LLC", "Bravo InstituteBravo Institute", "Charlie Group", "Delta IncorporatedDelta Incorporated"))
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-12-02 10:09:00

另一种方法是比较字符串的前半部分和字符串的下半部分。如果相同的话,选择上半场。如果公司名称中有数字、下划线或任何其他字符,也可以使用。

代码语言:javascript
复制
org <- c("Alpha Company", "Bravo InstituteBravo Institute", "Charlie Group", "Delta IncorporatedDelta Incorporated", "WD40WD40", "3M3M")

ifelse(substring(org, 1, nchar(org) / 2) == substring(org, nchar(org) / 2 + 1, nchar(org)), substring(org, 1, nchar(org) / 2), org)

# [1] "Alpha Company" "Bravo Institute" "Charlie Group" "Delta Incorporated" "WD40" "3M" 
票数 2
EN

Stack Overflow用户

发布于 2021-12-02 09:55:04

您可以将regex用作下面的一行:

代码语言:javascript
复制
my_df$org <- str_extract(string = my_df$org, pattern = "([A-Z][a-z]+ [A-Z][a-z]+){1}")
票数 1
EN

Stack Overflow用户

发布于 2021-12-02 09:54:14

如果所有单个单词都以大写字母开头(而不是后面跟着其他大写字母),那么您可以使用它来拆分。只保留唯一的元素,并粘贴+折叠。也将在奖金LCC-选项中工作。

代码语言:javascript
复制
org <- c("Alpha CompanyCompany , LLC", "Bravo InstituteBravo Institute", "Charlie Group", "Delta IncorporatedDelta Incorporated")

sapply(
  lapply(
    strsplit(gsub("[^A-Za-z0-9]", "", org), 
             "(?<=[^A-Z])(?=[A-Z])", 
             perl = TRUE),
    unique), 
  paste0, collapse = " ")

[1] "Alpha Company LLC"  "Bravo Institute"    "Charlie Group"      "Delta Incorporated"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70196665

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档