値のリストを参照するときに、おそらく%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
「または」(|
)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"
、および両方の一致を返します。
何を試したのかわかりませんが、これはうまくいくようです:
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
の結果がサブセットに使用されます。
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"