如何获得前两个字符匹配的元素

时间:2022-12-09 21:02:53

For example I observe the follwing data

例如,我观察了以下数据

[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"

I would like to grep the elements which start with "1.". I tried several attempts with grep() but I always end up getting the elements with "11." too. If I use strsplit on "\." ill get a list which makes things even more complicated. Then i tried the which() function for exact matching but i need only a exact match on the first two characters. For instance i dont care about the second number in "1.". I bet theres a sophisticated way to solve this but i just cant get it...

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

3 个解决方案

#1


2  

You need to escape the . twice!

你需要逃避。两次!

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

Since . is a special character in regular expressions you need to escape it in the regex if you want a period. Then since \ is a special character in R it also needs an escape.

自从。是正则表达式中的一个特殊字符,如果你想要一个句点,你需要在正则表达式中将其转义。因为\是R中的一个特殊字符,它还需要一个逃脱。

#2


2  

I find that using character classes can help escape from escape rage:

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

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"

The caret (^) at the start ensures that we match only at the start of the expression.

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

#3


1  

Assuming that dat is your your data set

假设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")

One option, using the fact that they are numbers

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

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

also, the stringr package wraps the regex functions for slightly easier use

此外,stringr包包装正则表达式函数以便稍微使用

  library(stringr)
  str_detect(dat, "^1\\.")

#1


2  

You need to escape the . twice!

你需要逃避。两次!

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

Since . is a special character in regular expressions you need to escape it in the regex if you want a period. Then since \ is a special character in R it also needs an escape.

自从。是正则表达式中的一个特殊字符,如果你想要一个句点,你需要在正则表达式中将其转义。因为\是R中的一个特殊字符,它还需要一个逃脱。

#2


2  

I find that using character classes can help escape from escape rage:

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

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"

The caret (^) at the start ensures that we match only at the start of the expression.

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

#3


1  

Assuming that dat is your your data set

假设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")

One option, using the fact that they are numbers

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

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

also, the stringr package wraps the regex functions for slightly easier use

此外,stringr包包装正则表达式函数以便稍微使用

  library(stringr)
  str_detect(dat, "^1\\.")