0

例如,我观察以下数据

[1] "1.1"   "1.2"   "1.3"   "1.4"   "1.5"   "1.6"   "1.7"   "1.8"   "1.9"  
 [10] "1.10"  "1.11"  "1.12"  "1.13"  "1.14"  "2.1"   "2.2"   "2.3"   "2.4"  
 [19] "2.5"   "2.6"   "2.7"   "2.8"   "2.9"   "2.10"  "2.11"  "2.12"  "2.13" 
 [28] "2.14"  "3.1"   "3.2"   "3.3"   "3.4"   "3.5"   "3.6"   "3.7"   "3.8"  
 [37] "3.9"   "3.10"  "3.11"  "3.12"  "3.13"  "3.14"  "4.1"   "4.2"   "4.3"  
 [46] "4.4"   "4.5"   "4.6"   "4.7"   "4.8"   "4.9"   "4.10"  "4.11"  "4.12" 
 [55] "4.13"  "4.14"  "5.1"   "5.2"   "5.3"   "5.4"   "5.5"   "5.6"   "5.7"  
 [64] "5.8"   "5.9"   "5.10"  "5.11"  "5.12"  "5.13"  "5.14"  "6.1"   "6.2"  
 [73] "6.3"   "6.4"   "6.5"   "6.6"   "6.7"   "6.8"   "6.9"   "6.10"  "6.11" 
 [82] "6.12"  "6.13"  "6.14"  "7.1"   "7.2"   "7.3"   "7.4"   "7.5"   "7.6"  
 [91] "7.7"   "7.8"   "7.9"   "7.10"  "7.11"  "7.12"  "7.13"  "7.14"  "8.1"  
[100] "8.2"   "8.3"   "8.4"   "8.5"   "8.6"   "8.7"   "8.8"   "8.9"   "8.10" 
[109] "8.11"  "8.12"  "8.13"  "8.14"  "9.1"   "9.2"   "9.3"   "9.4"   "9.5"  
[118] "9.6"   "9.7"   "9.8"   "9.9"   "9.10"  "9.11"  "9.12"  "9.13"  "9.14" 
[127] "10.1"  "10.2"  "10.3"  "10.4"  "10.5"  "10.6"  "10.7"  "10.8"  "10.9" 
[136] "10.10" "10.11" "10.12" "10.13" "10.14" "11.1"  "11.2"  "11.3"  "11.4" 
[145] "11.5"  "11.6"  "11.7"  "11.8"  "11.9"  "11.10" "11.11" "11.12" "11.13"
[154] "11.14" "12.1"  "12.2"  "12.3"  "12.4"  "12.5"  "12.6"  "12.7"  "12.8" 
[163] "12.9"  "12.10" "12.11" "12.12" "12.13" "12.14" "13.1"  "13.2"  "13.3" 
[172] "13.4"  "13.5"  "13.6"  "13.7"  "13.8"  "13.9"  "13.10" "13.11" "13.12"
[181] "13.13" "13.14" "14.1"  "14.2"  "14.3"  "14.4"  "14.5"  "14.6"  "14.7" 
[190] "14.8"  "14.9"  "14.10" "14.11" "14.12" "14.13" "14.14"

我想 grep 以“1.”开头的元素。我尝试使用 grep() 进行了几次尝试,但我总是以“11”获得元素。也。如果我在“\”上使用 strsplit。我会得到一份清单,这会使事情变得更加复杂。然后我尝试了 which() 函数进行精确匹配,但我只需要前两个字符的精确匹配。例如,我不关心“1”中的第二个数字。我敢打赌,有一种复杂的方法可以解决这个问题,但我就是不明白......

4

3 回答 3

2

你需要逃脱.两次!

grep('^1\\.', x)

因为.它是正则表达式中的一个特殊字符,如果你想要一个句点,你需要在正则表达式中对其进行转义。然后由于\是 R 中的特殊字符,它也需要转义。

于 2012-11-28T16:29:33.827 回答
2

我发现使用字符类可以帮助摆脱逃避愤怒:

x <- do.call("paste",c(expand.grid(1:14,1:14),sep="."))
grep("^[1][.]",x,value=T)
 [1] "1.1"  "1.2"  "1.3"  "1.4"  "1.5"  "1.6"  "1.7"  "1.8"  "1.9"  "1.10"
[11] "1.11" "1.12" "1.13" "1.14"

开头的插入符号 ( ^) 确保我们只匹配表达式的开头。

于 2012-11-28T16:33:21.000 回答
1

假设这dat是您的数据集

dat <- c("1.1","1.2","1.3","1.4","1.5","1.6","1.7","1.8","1.9","1.10","1.11","1.12","1.13","1.14","2.1","2.2","2.3","2.4","2.5","2.6","2.7","2.8","2.9","2.10","2.11","2.12","2.13","2.14","3.1","3.2","3.3","3.4","3.5","3.6","3.7","3.8","3.9","3.10","3.11","3.12","3.13","3.14","4.1","4.2","4.3","4.4","4.5","4.6","4.7","4.8","4.9","4.10","4.11","4.12","4.13","4.14","5.1","5.2","5.3","5.4","5.5","5.6","5.7","5.8","5.9","5.10","5.11","5.12","5.13","5.14","6.1","6.2","6.3","6.4","6.5","6.6","6.7","6.8","6.9","6.10","6.11","6.12","6.13","6.14","7.1","7.2","7.3","7.4","7.5","7.6","7.7","7.8","7.9","7.10","7.11","7.12","7.13","7.14","8.1","8.2","8.3","8.4","8.5","8.6","8.7","8.8","8.9","8.10","8.11","8.12","8.13","8.14","9.1","9.2","9.3","9.4","9.5","9.6","9.7","9.8","9.9","9.10","9.11","9.12","9.13","9.14","10.1","10.2","10.3","10.4","10.5","10.6","10.7","10.8","10.9","10.10","10.11","10.12","10.13","10.14","11.1","11.2","11.3","11.4","11.5","11.6","11.7","11.8","11.9","11.10","11.11","11.12","11.13","11.14","12.1","12.2","12.3","12.4","12.5","12.6","12.7","12.8","12.9","12.10","12.11","12.12","12.13","12.14","13.1","13.2","13.3","13.4","13.5","13.6","13.7","13.8","13.9","13.10","13.11","13.12","13.13","13.14","14.1","14.2","14.3","14.4","14.5","14.6","14.7","14.8","14.9","14.10","14.11","14.12","14.13","14.14")

一种选择,利用它们是数字的事实

    as.numeric(dat) > 1  & as.numeric(dat) < 2

此外,该stringr包包装了正则表达式函数,以便于使用

  library(stringr)
  str_detect(dat, "^1\\.")
于 2012-11-28T17:08:36.493 回答