我正在寻找从数据列中删除特定单词(例如“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. "))
但我仍然没有得到我想要的结果。
我认为这样的事情会奏效:
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+|$)")
匹配更多的空格或字符串的结尾。
您可以使用正则表达式语法
\\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
我逐字复制了您的示例列标题,因为它们有空格,所以在声明时它们需要在反引号内。如果您的实际列名没有空格,则不需要反引号。