替换和符号并组合周围的字符串

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

我正在对公司名称进行一些字符串清理,我想做两件事:

  1. 用'和'替换&符号。
  2. 合并&周围的字符串,但仅合并那些元素,而不是整个字符串

这是我到目前为止尝试过的,但是由于某种原因输出没有被矢量化。

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    |

谢谢!

r regex stringr
1个回答
1
投票

这里的问题是str_split返回一个列表,其中包含每个字符串的条目,而str_split(name, "\\s+")[[1]]您始终引用第一个字符串的条目。因此,您必须将功能映射到列表的每个条目。您可以使用lapplymap包中的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 
© www.soinside.com 2019 - 2024. All rights reserved.