我正在对公司名称进行一些字符串清理,我想做两件事:
这是我到目前为止尝试过的,但是由于某种原因输出没有被矢量化。
library(stringr)
library(dplyr)
test <- tibble(name = c("brady & frank mortgage bank", "joe and sons deli"))
new <- test %>%
mutate(clean = paste(str_split(name, "\\s+")[[1]][grep("&|and", str_split(name, "\\s+")[[1]]) - 1],
str_split(name, "\\s+")[[1]][grep("&|and", str_split(name, "\\s+")[[1]]) + 1], sep = "and"))
这里是输出:
|name |clean |
|:---------------------------|:-------------|
|brady & frank mortgage bank |bradyandfrank |
|joe and sons deli |bradyandfrank |
我以某种方式知道clean
var引用了第一个元素,但是我不确定为什么不进行向量化。
这是我想要的输出:
|name |clean |
|:---------------------------|:-------------|
|brady & frank mortgage bank |bradyandfrank |
|joe and sons deli |joeandsons |
谢谢!
这里的问题是str_split
返回一个列表,其中包含每个字符串的条目,而str_split(name, "\\s+")[[1]]
您始终引用第一个字符串的条目。因此,您必须将功能映射到列表的每个条目。您可以使用lapply
或map
包中的purrr
函数来执行此操作:
new <- test %>%
mutate(clean = purrr::map_chr(name, function(x) {
paste(str_split(x, "\\s+")[[1]][grep("&|and", str_split(x, "\\s+")[[1]]) - 1],
str_split(x, "\\s+")[[1]][grep("&|and", str_split(x, "\\s+")[[1]]) + 1], sep = "and")
}))
> new
# A tibble: 2 x 2
name clean
<chr> <chr>
1 brady & frank mortgage bank bradyandfrank
2 joe and sons deli joeandsons