我在dataframe中有一个组织名称向量。其中一些很好,另一些则在同一个元素中重复了两次。而且,当该名称被重复时,没有分隔空间,因此名称具有camelCase外观。
例如(为一般数据引用添加的id列):
1阿尔法连
2布拉沃InstituteBravo研究所
3查理集团
德尔塔IncorporatedDelta公司
但看起来应该是:
1阿尔法连
2布拉沃研究所
3查理集团
4德尔塔公司
我有一个解决方案,得到我需要的结果--下面是可重复的示例代码。然而,它似乎有点长,不太优雅。
对于同样的结果,有谁有更好的方法吗?
额外的问题:如果组织中包含“type”,比如Alpha Company,LLC,那么我修复camelCase的gsub()行也不起作用。对于如何调整camelCase补丁以解释",LLC“,以及如何处理其余的解决方案,有什么建议吗?
提前感谢!(多亏了OP &那些在上提供帮助的人)
# 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"))发布于 2021-12-02 10:09:00
另一种方法是比较字符串的前半部分和字符串的下半部分。如果相同的话,选择上半场。如果公司名称中有数字、下划线或任何其他字符,也可以使用。
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" 发布于 2021-12-02 09:55:04
您可以将regex用作下面的一行:
my_df$org <- str_extract(string = my_df$org, pattern = "([A-Z][a-z]+ [A-Z][a-z]+){1}")发布于 2021-12-02 09:54:14
如果所有单个单词都以大写字母开头(而不是后面跟着其他大写字母),那么您可以使用它来拆分。只保留唯一的元素,并粘贴+折叠。也将在奖金LCC-选项中工作。
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"https://stackoverflow.com/questions/70196665
复制相似问题