首页 > 解决方案 > 使用gsub在R中用破折号分隔短语中的中间词

问题描述

我有以下内容:

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

我想保留“Paulista”、“Mineiro”、“Carioca”

我正在尝试 gsub

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

但不工作。

标签: rgsub

解决方案


两种快速方法:

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

下一个通过将字符串拆分"-"为 a来工作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用于减少前导和尾随空格。


推荐阅读