web-dev-qa-db-ja.com

ワイルドカードを使用したパターンマッチング

ワイルドカードを使用して文字列を識別するにはどうすればよいですか?

glob2rx、しかし、私はそれを使用する方法を完全に理解していません。次のコードを使用して、Word blueで始まるデータフレームの行を選択しようとしました。

# make data frame
a <- data.frame( x =  c('red','blue1','blue2', 'red2'))

# 1
result <- subset(a, x == glob2rx("blue*") )

# 2
test = ls(pattern = glob2rx("blue*"))
result2 <- subset(a, x == test )

# 3
result3 <- subset(a, x == pattern("blue*") )

ただし、どちらも機能しませんでした。これを試みるために別の関数を使用する必要があるかどうかはわかりません。

37
djq

データフレーム内の要素を調べたい場合は、現在のワークスペース内のオブジェクトの名前のみを調べるls()を使用しないでください(または現在の環境の関数内で使用する場合)。そのようなオブジェクト内の行名または要素は、ls()からは見えません(もちろん、ls(.)- callに環境引数を追加しない限り)。文字ベクトルのパターンマッチングの主な機能であるgrep()を使用してみてください。

_result <- a[ grep("blue", a$x) , ]  # Note need to use `a$` to get at the `x`
_

サブセットを使用する場合は、サブセット引数で使用できる論理のベクトルを返す密接に関連する関数grepl()を検討してください。

_subset(a, grepl("blue", a$x))
      x
2 blue1
3 blue2
_

編集:サブセット()内のglob2rxの1つの「適切な」使用を追加します:

_result <- subset(a,  grepl(glob2rx("blue*") , x) )
result
      x
2 blue1
3 blue2
_

この質問に戻るまで、実際に_glob2rx_を理解したとは思わない。 (質問者の難しさの根源である範囲の問題を理解しました。これを読んでいる人は誰でもGavinの答えにスクロールダウンして、それを支持するべきです。)

41
42-

glob2rx()は、ワイルドカードを含むパターンを同等の正規表現に変換します。次に、この正規表現をRのパターンマッチングツールの1つに渡す必要があります。

_"blue*"_を一致させる場合、_*_には通常のワイルドカード、not正規表現があります。つまり、glob2rx()を使用して、ワイルドカードパターンを便利なものに変換します。正規表現:

_> glob2rx("blue*")
[1] "^blue"
_

返されるオブジェクトisは正規表現です。

あなたのデータを考える:

_x <- c('red','blue1','blue2', 'red2')
_

grep()または同様のツールを使用してパターンマッチすることができます。

_> grx <- glob2rx("blue*")
> grep(grx, x)
[1] 2 3
> grep(grx, x, value = TRUE)
[1] "blue1" "blue2"
> grepl(grx, x)
[1] FALSE  TRUE  TRUE FALSE
_

あなたが投稿した行の選択の問題については

_> a <- data.frame(x =  c('red','blue1','blue2', 'red2'))
> with(a, a[grepl(grx, x), ])
[1] blue1 blue2
Levels: blue1 blue2 red red2
> with(a, a[grep(grx, x), ])
[1] blue1 blue2
Levels: blue1 blue2 red red2
_

またはsubset()経由:

_> with(a, subset(a, subset = grepl(grx, x)))
      x
2 blue1
3 blue2
_

grob2rx()が何をするのか、そしてそれをどのように使用するのかを説明してくれるといいのですが?

32
Gavin Simpson

あなたは正しい軌道に乗っています-グーグルで検索するべきキーワードは正規表現です。 Rは、grep()および他のいくつかの代替手段を使用して、これよりも直接的な方法でそれらをサポートします。

詳細な説明は次のとおりです。 http://www.regular-expressions.info/rlanguage.html

4
Brian MacKay

パッケージdata.tableを使用することもできます。Like関数、詳細は以下に示します サブストリングの一致に基づいてR data.table行を選択する方法(SQLなど)

2
usct01

ワイルドカードを使用して特定の変数を特定する場合は、次のようにls()grep()の組み合わせを使用できます。

l = ls()
vars.with.result <- l[grep("result", l)]

2
Brian D