Grep表示R中的一系列数字

时间:2015-02-03 16:21:26

标签: r grep

在R中,我希望在数据帧的列中匹配1002到1400之间的数字范围,以便我可以提取相关索引。

到目前为止,我已经尝试过:

grep("1[0-4][0-9][0-9][0-9]",x$toMatch)

但这不起作用,因为它也会得到1000和1001

如果没有列出所有数字,有没有办法做到这一点?

2 个答案:

答案 0 :(得分:5)

number_range中使用rebus。 (确保你得到v0.0-5或更高版本;早期版本在这个函数中有一个错误。)

library(rebus)
x <- c('blah 1002', '1400 xx', '1234')
(rx <- number_range(1002, 1400))
## <regex> (?:100[2-9]|10[1-9][0-9]|1[1-3][0-9]{2}|1400)
grep(rx, x)

答案 1 :(得分:2)

使用这个方便的网页制作范围的正则表达式:http://utilitymill.com/utility/Regex_For_Range

然后,首先测试边缘情况的一些示例数据(注意最后一个示例,其中包含您希望嵌入更大数字的数字,只是为了检查是否有效):

> x=paste("X",c(999:1004,1399:1402,99100499),"N")
> x
 [1] "X 999 N"      "X 1000 N"     "X 1001 N"     "X 1002 N"     "X 1003 N"    
 [6] "X 1004 N"     "X 1399 N"     "X 1400 N"     "X 1401 N"     "X 1402 N"    
[11] "X 99100499 N"

然后来自网站的正则表达式有足够的反斜杠来让R高兴:

> rx="\\b1(0(0[2-9]|[1-9][0-9])|[1-3][0-9]{2}|400)\\b"

,并提供:

> x[grep(rx,x)]
[1] "X 1002 N" "X 1003 N" "X 1004 N" "X 1399 N" "X 1400 N"

添加额外的测试用例直到你可以破解它......