在R中,我希望在数据帧的列中匹配1002到1400之间的数字范围,以便我可以提取相关索引。
到目前为止,我已经尝试过:
grep("1[0-4][0-9][0-9][0-9]",x$toMatch)
但这不起作用,因为它也会得到1000和1001
如果没有列出所有数字,有没有办法做到这一点?
答案 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"
添加额外的测试用例直到你可以破解它......