首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用gsub在R中用破折号分隔中间的单词

用gsub在R中用破折号分隔中间的单词
EN

Stack Overflow用户
提问于 2018-11-03 15:38:05
回答 2查看 1.4K关注 0票数 2

我有以下几点:

代码语言:javascript
运行
复制
x <- c("Sao Paulo - Paulista - SP", "Minas Gerais - Mineiro - MG", "Rio de Janeiro - Carioca -RJ")

我想保留"Paulista","Mineiro","Carioca“

我在试着像

代码语言:javascript
运行
复制
y <- gsub("\\$-*","",x)

但不起作用。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-03 15:41:00

我们只需调用一次sub就可以做到这一点。

代码语言:javascript
运行
复制
x <- c(" Sao Paulo - Paulista - SP",
       "Minas Gerais - Mineiro - MG",
       "Rio de Janeiro - Carioca -RJ")

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

这个想法是捕捉在每一个位置的两个破折号之间发生的一切。

代码语言:javascript
运行
复制
^.*-\\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
票数 2
EN

Stack Overflow用户

发布于 2018-11-03 15:41:12

有两种快速方法:

代码语言:javascript
运行
复制
x<- c(" Sao Paulo - Paulista - SP", "Minas Gerais - Mineiro - MG", "Rio de Janeiro - Carioca -RJ")

第一个是标准的sub解决方案;如果有没有连字符的字符串,它将返回未修改的完整字符串。

代码语言:javascript
运行
复制
trimws(sub("^[^-]*-([^-]*)-.*$", "\\1", x))
# [1] "Paulista" "Mineiro"  "Carioca" 

sub内部

代码语言:javascript
运行
复制
"^[^-]*-([^-]*)-.*$"
 ^                   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中出错。

代码语言:javascript
运行
复制
trimws(sapply(strsplit(x, "-"), `[[`, 2))
# [1] "Paulista" "Mineiro"  "Carioca" 

strsplit的示例调用

代码语言:javascript
运行
复制
strsplit(x[[1]], "-")
# [[1]]
# [1] " Sao Paulo " " Paulista "  " SP"        

..。因此,第二个元素是Paulista (带有额外的前导/尾随空格)。周围的sapply总是抓取第二个元素(这是字符串不匹配时的错误)。

这两种解决方案都使用trimws来减少前导和尾随空格。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53132839

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档