Два быстрых метода:
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
для уменьшения начальных и конечных пробелов.