0

名前にちょうど 2 つの O が含まれる州を検索したいと考えています。私はこれを試しました:

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

問題: 「コロラド」には 3 つの O があり、それは必要ありません。正規表現を修正するにはどうすればよいですか?

また、次の 3 つの O も実行したいと考えています。

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

これを行う簡単な方法はありますか?

4

5 に答える 5

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 の州を含めたい場合は追加できます。

于 2012-07-27T02:01:46.843 に答える
2

マイケルの反応は間違いなく雄弁ですが、力ずくの方法は次のとおりです。

state.name[sapply(strsplit(tolower(state.name), NULL), function(x) sum(x %in% "o") == 2)]
于 2012-07-27T01:40:19.557 に答える
1

一致する 2 つの O 以外に、一致する他の文字が O でないことを確認する必要があります。

grep("^[^o]*o[^o]*o[^o]*$", state.name, value = TRUE)
于 2012-07-27T01:24:17.887 に答える
0

?gregexpr を使用したソリューション: 少し見にくいですが、他の正規表現にうまく一般化できます。(オハイオ州の大文字 O を忘れないでください。)

state.name[sapply(state.name,function(x) length(unlist(gregexpr("o|O",x)))) == 2]
于 2012-07-27T02:00:28.930 に答える
0

状態名の OS の数をカウントします。

State <- c("North Dakota","Ohio","Colorado","South Dakota")
nos <- nchar(gsub("[^oO]","",State))
State[nos==2]
State[nos==3]
于 2012-07-27T10:08:15.540 に答える