从列 r

问题描述 投票:0回答:2

我正在寻找从数据列中删除特定单词(例如“co”“INC”等)而不从同一列中的其他单词中删除相同的字母。换句话说,我只想在它们独立时删除这些词。

这是 company_name 数据的几行和几列的示例:

状态 公司名称 工人人数
x COLGATE-PALMOLIVE CO. 10
y 旧铜业公司 77
z NIKE INC -CL B 5
r 商业金属 23
w CARNIVAL CORPORATION & PLC 89

我用下面的代码删除了单词:

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

我得到的回报不是我所期待的。例如,在公司“CARNIVAL CORPORATION & PLC”的情况下,我得到了“CARNIVAL ORATION & PLC”,其中“CO 从一开始就被删除了”是“CORPORATION”

我想要实现的是,只有当单词本身是完整的单词时,它们才会被删除。我还尝试在代码中的单词前后包含空格,如下所示:

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

但我仍然没有得到我想要的结果。

r string data-cleaning
2个回答
0
投票

我认为这样的事情会奏效:

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+|$)")
匹配更多的空格或字符串的结尾。


0
投票

您可以使用正则表达式语法

\\b
,它设置单词边界并且很有用,就像您所说的那样处理“自己的完整单词”。请注意,您必须在
\\bCO\\b.
之前列出
\\bCO\\b
,因为匹配是按顺序进行的。我没有为“-CL B”使用单词边界,但如果需要,您可以将匹配项的非字母部分放在单词边界之外,例如
-\\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

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

© www.soinside.com 2019 - 2024. All rights reserved.