6

如果我有一个字符串并且想在最后一位上拆分并保留拆分 hpw 的最后一部分,我可以这样做吗?

x <- c("ID", paste0("X", 1:10, state.name[1:10]))

我想要

 [1] NA            "Alabama"     "Alaska"      "Arizona"     "Arkansas"   
 [6] "California"  "Colorado"    "Connecticut" "Delaware"    "Florida"    
[11] "Georgia"    

但会满足于:

 [1] "ID"          "Alabama"     "Alaska"      "Arizona"     "Arkansas"   
 [6] "California"  "Colorado"    "Connecticut" "Delaware"    "Florida"    
[11] "Georgia"    

我可以通过以下方式获得第一部分:

unlist(strsplit(x, "[^0-9]*$"))

但是想要第二部。

先感谢您。

4

4 回答 4

4

您可以使用正则表达式完成这一简单的步骤:

gsub("(^.*\\d+)(\\w*)", "\\2", x)

结果是:

 [1] "ID"          "Alabama"     "Alaska"      "Arizona"     "Arkansas"    "California"  "Colorado"    "Connecticut"
 [9] "Delaware"    "Florida"     "Georgia"  

正则表达式的作用:

  1. "(^.*\\d+)(\\w*)": 寻找两组字符。
    • 第一组(^.*\\d+)在字符串的开头查找任何数字,后跟至少一个数字。
    • 第二组\\w*查找字母数字字符。
  2. 作为"\\2"第二个参数的gsub()意思是用正则表达式找到的第二组替换原始字符串。
于 2012-05-24T09:01:05.237 回答
2
library(stringr)
unlist(lapply(str_split(x, "[0-9]"), tail,n=1))

[1] "ID"          "Alabama"     "Alaska"      "Arizona"     "Arkansas"    "California"  "Colorado"    "Connecticut" "Delaware"   
[10] "Florida"     "Georgia"

我会查看文档stringr以寻找(最有可能)更好的方法。

于 2012-05-24T06:08:55.863 回答
2

这似乎有点笨拙,但它有效:

state.pt2 <- unlist(strsplit(x,"^.[0-9]+"))
state.pt2[state.pt2!=""]

在字符串开头删除匹配生成的 ' 会很好,""但我无法弄清楚。

这是另一种使用substrand的方法,gregexpr它也避免了对结果进行子集化:

substr(x,unlist(lapply(gregexpr("[0-9]",x),max))+1,nchar(x))
于 2012-05-24T06:16:24.283 回答
2

gsubfn

试试这个gsubfn解决方案:

> library(gsubfn)
> strapply(x, ".*\\d(\\w*)|$", ~ if (nchar(z)) z else NA, simplify = TRUE)
 [1] NA            "Alabama"     "Alaska"      "Arizona"     "Arkansas"   
 [6] "California"  "Colorado"    "Connecticut" "Delaware"    "Florida"    
[11] "Georgia"    

它匹配最后一个数字后跟单词字符并返回单词字符,或者如果失败则匹配行尾(以确保它匹配某些内容)。如果第一个匹配成功则返回它;否则,反向引用将为空,因此返回 NA。

请注意,公式是编写函数的简写方式,function(z) if (nchar(z)) z else NA并且该函数可以交替替换公式,但会以稍微多一点的击键为代价。

gsub

类似的策略也可以直接使用,gsub但需要两行和一个稍微复杂的正则表达式。在这里,我们使用第二种方法从第一种方法中剔除不匹配的内容:

> s <- gsub(".*\\d(\\w*)|.*", "\\1", x)
> ifelse(nchar(s), s, NA)
 [1] NA            "Alabama"     "Alaska"      "Arizona"     "Arkansas"   
 [6] "California"  "Colorado"    "Connecticut" "Delaware"    "Florida"    
[11] "Georgia"    

编辑:小改进

于 2012-05-24T12:12:37.260 回答