Заменить символ & и объединить окружающие строки - PullRequest
0 голосов
/ 29 мая 2020

Я занимаюсь чисткой строк в названиях компаний и хотел бы сделать две вещи:

  1. Заменить символ амперсанда (&) на 'and'.
  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    |

Спасибо!

1 Ответ

2 голосов
/ 29 мая 2020

Проблема здесь в том, что 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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...