从列r中删除特定单词

eyh26e7m  于 2023-05-04  发布在  其他
关注(0)|答案(2)|浏览(201)

我希望从数据中的一列中删除特定的单词(例如“co”“INC”等),而不从同一列中的其他单词中删除相同的字母。换句话说,我只想删除这些词时,他们是免费的。
下面是company_name数据的几行和几列的示例:
| 国家|公司名称|工人人数|
| --------------|--------------|--------------|
| x|高露洁棕榄公司|10个|
| y|老铜公司|七十七|
| z|NIKE INC -CL B|五|
| r|商业金属|二十三|
| w|嘉年华公司|八九|
我使用了以下代码来删除单词:

remove <- company_name %>% 
  mutate(Company_Name = str_remove_all(Company_Name, "-CL B|INC|CORP|CO|CO."))

我得到的回报并不是我所期望的。例如,在公司的情况下“嘉年华公司& PLC”我得到了“嘉年华演说& PLC”回来,其中“CO从一开始就被删除了”公司“
我想达到的目的是,只有当这些词本身是完整的词时,它们才能被删除。我还尝试在代码中的单词前后包含空格,如下所示:

remove <- company_name %>% 
  mutate(Company_Name = str_remove_all(Company_Name, " -CL B | INC | CORP | CO  | CO. "))

但我还是没有得到我想要的结果。

kq0g1dla

kq0g1dla1#

您可以使用正则表达式语法\\b,它设置单词边界,并且对于处理您所说的“完整单词”非常有用。注意,你必须在\\bCO\\b之前列出\\bCO\\b.,因为匹配是按顺序完成的。我没有为“-CL B”使用单词边界,但如果需要,可以将匹配的非字母部分放在单词边界e之外。例如-\\bCL B\\b

library(dplyr)
library(stringr)
# Your sample data
company_name <- data.frame(State = c("x", "y", "z", "r", "w"),
                           `Company Name` = c("COLGATE-PALMOLIVE CO.",
                                              "OLD COPPER CO INC",
                                              "NIKE INC -CL B",
                                              "COMMERCIAL METALS",
                                              "CARNIVAL CORPORATION & PLC"),
                           `number of workers` = c(10, 77, 5, 23, 89),
                           check.names = FALSE)

# Regex with str_remove_all() using word boundaries
company_name %>% 
  mutate(Company_Name = str_remove_all(`Company Name`, 
                                       "-CL B|\\bINC\\b|\\bCORP\\b|\\bCO\\b.|\\bCO\\b"),
         Company_Name = trimws(Company_Name, which = "right")) # Remove trailing whitespaces

#   State               Company Name number of workers               Company_Name
# 1     x      COLGATE-PALMOLIVE CO.                10          COLGATE-PALMOLIVE
# 2     y          OLD COPPER CO INC                77                 OLD COPPER
# 3     z             NIKE INC -CL B                 5                       NIKE
# 4     r          COMMERCIAL METALS                23          COMMERCIAL METALS
# 5     w CARNIVAL CORPORATION & PLC                89 CARNIVAL CORPORATION & PLC

我逐字复制了你的示例列标题,因为它们有空格,所以在声明时需要在反引号内。如果实际列名中没有空格,则不需要反引号。

jfewjypa

jfewjypa2#

我想这样的东西会起作用:

strings_to_remove <- c("-CL","B","INC","CORP","CO")
regex<-paste(paste0("(^|\\s+)", strings_to_remove, "\\.?", "(?=\\s+|$)"),collapse="|")
remove <- company_name %>% 
  mutate(Company_Name = str_remove_all(Company_Name, regex))

其中"(^|\\s+)"匹配要删除的字符串之前的字符串开头(^或空白)。
"\\.?"匹配可选句点
"(?=\\s+|$)")匹配更多的空格或字符串的结尾。
(This答案假设您也希望删除“INC.”和“CORP.“虽然这在你的问题中没有具体说明)。

相关问题