2012-05-24 35 views
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]*$")) 

,但希望第二部分。

预先感谢您。

回答

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的(最有可能)一个更好的办法。

+0

两者你是第一个极好的选择。谢谢。 –

+3

你可以在不加载stringr的情况下做同样的事情:'sapply(strsplit(x,“[0-9]”),tail,n = 1)' – Dason

+0

@Dason - 这是一个简洁易懂的解决方案。我总是忘记使用'tail'和'head' - 也许我应该在我的'.First'文件中写一些说''不要忘记函数x,y,z - 签名,我'的文件'' – thelatemail

2

这似乎有点笨重,但它的工作原理:

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

这将是很好删除字符串的开始被对手所产生的""的,但我不明白这一点。

下面是使用substrgregexpr太那个避免了于子集的结果的另一种方法:

substr(x,unlist(lapply(gregexpr("[0-9]",x),max))+1,nchar(x)) 
+0

做得好,在基地。我非常感激。 +1 –

+0

你有多礼貌! :-D – thelatemail

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()的第二个参数意味着将原始字符串替换为正则表达式找到的第二个组。
+0

我甚至演示了重新命名列名的重塑类似的东西。感谢提醒我,我是一个蠢货。可能是最短的答案。很好的解释,这正是很多正则表达式的答案。 +1 –

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"  

编辑:小的改进

+0

非常感谢,并获得NA。非常短+1 –

相关问题