web-dev-qa-db-ja.com

Rのgreplは、文字列のリストのいずれかに一致するものを見つけます。

値のリストを参照するときに、おそらく%in%演算子を使用して、grepl引数を使用できますか?以下のデータを取得し、動物名に「犬」または「猫」が含まれている場合、特定の値、たとえば「キープ」を返します。 「犬」または「猫」がない場合は、「破棄」を返します。

data <- data.frame(animal = sample(c("cat","dog","bird", 'doggy','kittycat'), 50, replace = T))

さて、「cat」と「dog」などの値を厳密に一致させてこれを実行するだけであれば、次のアプローチを使用できます。

matches <- c("cat","dog")

data$keep <- ifelse(data$animal %in% matches, "Keep", "Discard")

ただし、grepまたはgreplを使用すると、リストの最初の引数のみが参照されます。

data$keep <- ifelse(grepl(matches, data$animal), "Keep","Discard")

戻り値

Warning message:
In grepl(matches, data$animal) :
  argument 'pattern' has length > 1 and only the first element will be used

検索でこのスレッドを見ましたが、これは機能していないようです: 複数のパターンを持つ文字ベクトルを使用したgrep

13
Marc Tulla

「または」(|greplの正規表現内のステートメント。

ifelse(grepl("dog|cat", data$animal), "keep", "discard")
# [1] "keep"    "keep"    "discard" "keep"    "keep"    "keep"    "keep"    "discard"
# [9] "keep"    "keep"    "keep"    "keep"    "keep"    "keep"    "discard" "keep"   
#[17] "discard" "keep"    "keep"    "discard" "keep"    "keep"    "discard" "keep"   
#[25] "keep"    "keep"    "keep"    "keep"    "keep"    "keep"    "keep"    "keep"   
#[33] "keep"    "discard" "keep"    "discard" "keep"    "discard" "keep"    "keep"   
#[41] "keep"    "keep"    "keep"    "keep"    "keep"    "keep"    "keep"    "keep"   
#[49] "keep"    "discard"

正規表現dog|catは、正規表現エンジンに"dog"または"cat"、および両方の一致を返します。

21
Rich Scriven

何を試したのかわかりませんが、これはうまくいくようです:

data$keep <- ifelse(grepl(paste(matches, collapse = "|"), data$animal), "Keep","Discard")

リンクした答えに似ています。

秘Theは、ペーストを使用することです。

paste(matches, collapse = "|")
#[1] "cat|dog"

したがって、dog OR catのいずれかで正規表現を作成し、それぞれを入力せずにパターンの長いリストで動作します。

編集:

「キープ」および「破棄」エントリに従って後でdata.frameをサブセット化するためにこれを行う場合は、次を使用してこれを直接行うことができます。

data[grepl(paste(matches, collapse = "|"), data$animal),]

この方法では、TRUEまたはFALSEであるgreplの結果がサブセットに使用されます。

14

ifelseをできるだけ避けるようにしてください。これは、たとえば、うまく機能します

c("Discard", "Keep")[grepl("(dog|cat)", data$animal) + 1]

のために 123あなたが得る種

##  [1] "Keep"    "Keep"    "Discard" "Keep"    "Keep"    "Keep"    "Discard" "Keep"   
##  [9] "Discard" "Discard" "Keep"    "Discard" "Keep"    "Discard" "Keep"    "Keep"   
## [17] "Keep"    "Keep"    "Keep"    "Keep"    "Keep"    "Keep"    "Keep"    "Keep"   
## [25] "Keep"    "Keep"    "Discard" "Discard" "Keep"    "Keep"    "Keep"    "Keep"   
## [33] "Keep"    "Keep"    "Keep"    "Discard" "Keep"    "Keep"    "Keep"    "Keep"   
## [41] "Keep"    "Discard" "Discard" "Keep"    "Keep"    "Keep"    "Keep"    "Discard"
## [49] "Keep"    "Keep"   
13
David Arenburg