Храните средние слова в фразе, разделенной тире в R, используя gsub - PullRequest
0 голосов
/ 03 ноября 2018

У меня есть следующее:

x <- c("Sao Paulo - Paulista - SP", "Minas Gerais - Mineiro - MG", "Rio de Janeiro - Carioca -RJ")

Я хочу оставить «Паулиста», «Минейро», «Кариока»

я пытаюсь gsub как

y <- gsub("\\$-*","",x)

но не работает.

Ответы [ 2 ]

0 голосов
/ 03 ноября 2018

Два быстрых метода:

x<- c(" Sao Paulo - Paulista - SP", "Minas Gerais - Mineiro - MG", "Rio de Janeiro - Carioca -RJ")

Это первое стандартное решение sub; если есть строки без дефисов, он вернет все строки без изменений.

trimws(sub("^[^-]*-([^-]*)-.*$", "\\1", x))
# [1] "Paulista" "Mineiro"  "Carioca" 

В пределах sub:

"^[^-]*-([^-]*)-.*$"
 ^                   beginning of each string, avoids mid-string matches
  [^-]*              matches 0 or more non-hyphen characters
       -             literal hyphen
        ([^-]*)      matches and stores 0 or more non-hyphen charactesr
               -     literal hyphen
                .*   0 or more of anything (incl hyphens)
                  5  end of each string

"\\1"                replace everything that matches with the stored substring

Следующий работает, разбивая строку на "-" на list, которая затем индексируется для второго элемента. Если есть строки без дефисов, это приведет к ошибке subscript out of bounds.

trimws(sapply(strsplit(x, "-"), `[[`, 2))
# [1] "Paulista" "Mineiro"  "Carioca" 

Пример звонка на strsplit:

strsplit(x[[1]], "-")
# [[1]]
# [1] " Sao Paulo " " Paulista "  " SP"        

... поэтому второй элемент - Paulista (с дополнительным пробелом в начале / в конце). Окружение sapply всегда захватывает второй элемент (это ошибки, когда строка не совпадает).

Оба решения используют trimws для уменьшения начальных и конечных пробелов.

0 голосов
/ 03 ноября 2018

Мы можем сделать это с помощью одного вызова sub:

x <- c(" Sao Paulo - Paulista - SP",
       "Minas Gerais - Mineiro - MG",
       "Rio de Janeiro - Carioca -RJ")

sub("^.*-\\s+(.*?)\\s+-.*$", "\\1", x)
[1] "Paulista" "Mineiro"  "Carioca"

Идея состоит в том, чтобы фиксировать все, что происходит между двумя штрихами в каждой локации.

^.*-\\s+   from the start, consume everything up to and including the first dash
(.*?)      then match and capture everything up until the second dash
\\s+-.*$   consume everything after and including the second dash
...