2012-07-27 93 views
0

我想查找名稱中只有兩個Os的狀態。我試過這個:R:查找字符數組中的特定字符數

> data(state) 
> index=grep('o.*o',state.name) 
> state.name[index] 
"Colorado"  "North Carolina" "North Dakota" "South Carolina" "South Dakota" 

問題:在「科羅拉多州」有三個Os,我不想要它。我如何修改我的正則表達式?

我也希望做三鋨:

> data(state) 
> index=grep('o.*o.*o',state.name) 
> state.name[index] 
"Colorado" 

有沒有一種簡單的方法來做到這一點?

回答

1

你應當確保你匹配其他字符,除了兩個匹配的操作系統,不鋨:

grep("^[^o]*o[^o]*o[^o]*$", state.name, value = TRUE) 
2

邁克爾的迴應是肯定更雄辯但這裏的蠻力方法:

state.name[sapply(strsplit(tolower(state.name), NULL), function(x) sum(x %in% "o") == 2)] 
0

使用?gregexpr的解決方案:有點難看,但很好地推廣到其他正則表達式。 (不要忘了在俄亥俄州首府O操作。)

state.name[sapply(state.name,function(x) length(unlist(gregexpr("o|O",x)))) == 2] 
3

你可以這樣做:

grep('^([^o]*o[^o]*){2}$', state.name, value = TRUE) 
# [1] "North Carolina" "North Dakota" 
# [3] "South Carolina" "South Dakota" 

grep('^([^o]*o[^o]*){3}$', state.name, value = TRUE) 
# [1] "Colorado" 

和GSEE以下建議,你可以添加ignore.case = TRUE,如果你想以包括大寫的O態像俄亥俄州,俄克拉何馬州和俄勒岡州。

+0

我總是忘記'value = TRUE'。 +1 – 2012-07-27 02:16:14

+1

+1。正如@ user1547166指出的那樣,OP可能希望包含以大寫「O」開頭的狀態,在這種情況下,您可以在'grep'調用中使用'ignore.case = TRUE'。 – GSee 2012-07-27 02:23:26

+0

我喜歡,這很容易推廣到任何數量的操作系統。 +1 – 2012-07-27 14:44:00

0

計算狀態名稱中的os數量。

State <- c("North Dakota","Ohio","Colorado","South Dakota") 
nos <- nchar(gsub("[^oO]","",State)) 
State[nos==2] 
State[nos==3] 
相關問題