如果我有一个字符串并希望拆分最后一个数字并保留拆分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]*$"))
但是想要第二部分。
提前谢谢。
答案 0 :(得分:4)
您可以使用正则表达式轻松完成此操作:
gsub("(^.*\\d+)(\\w*)", "\\2", x)
结果:
[1] "ID" "Alabama" "Alaska" "Arizona" "Arkansas" "California" "Colorado" "Connecticut"
[9] "Delaware" "Florida" "Georgia"
正则表达式的作用:
"(^.*\\d+)(\\w*)"
:寻找两组角色。
(^.*\\d+)
查找任何数字,后跟字符串开头的至少一个数字。\\w*
查找字母数字字符。"\\2"
作为gsub()
的第二个参数意味着用正则表达式找到的第二个组替换原始字符串。答案 1 :(得分: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
(最有可能)更好的方法。
答案 2 :(得分:2)
这看起来有点笨重,但它有效:
state.pt2 <- unlist(strsplit(x,"^.[0-9]+"))
state.pt2[state.pt2!=""]
最好删除字符串开头的匹配所生成的""
,但我无法弄明白。
这是使用substr
和gregexpr
的另一种方法,可以避免必须对结果进行分组:
substr(x,unlist(lapply(gregexpr("[0-9]",x),max))+1,nchar(x))
答案 3 :(得分: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"
编辑:小改进