web-dev-qa-db-ja.com

Rの特定の文字を含む文字列ベクトルからエントリを削除します

私は2つの文字ベクトルを持っています:

x = {"a", "b", "c", "kt"}
y = {"abs", "kot", "ccf", "okt", "kk", "y"}

次のように、xを使用してyからエントリを削除し、xのエントリを含まない文字列のみが残るようにする必要があります。

y = {"kot", "kk", "y"}

コードは、任意のサイズのベクトルxおよびyで機能するはずです。

これまでgsubとgreplを使用しようとしましたが、これらは単一の文字列でのみ機能します。これを行うためにループを作成しようとしましたが、問題は思ったより難しいようです。そしてもちろん、ソリューションが洗練されているほど優れていますが、この場合、ベクトルxとyには最大200のエントリがあると想定できます。

9
Lecromine

grepを使用して、yのどの値がxのパターンに一致するかを調べ、!%in%を使用してそれらを除外できます。

y[!y %in% grep(paste0(x, collapse = "|"), y, value = T)]

#[1] "kot" "kk"  "y"  

または、ブールベクトルを返すため、greplを使用するとさらに効果的です。

y[!grepl(paste0(x, collapse = "|"), y)]

grepおよびinvertパラメーターを使用したvalueの簡潔なバージョン

grep(paste0(x, collapse = "|"), y, invert = TRUE, value = TRUE)
#[1] "kot" "kk"  "y"  
12
Ronak Shah

@Ronakによって与えられた答えは私のものよりも好ましいように見えますが、1つのオプションは、sapplygreplを使用して、yの各エントリについて、xに対する一致のマトリックスを取得し、それをapplyへの別の呼び出しでロールアップすることです。

> y[!apply(sapply(x, function(q) {grepl(q, y)}), 1, function(x) {sum(as.numeric(x)) > 0})]
[1] "kot" "kk"  "y"  

一致のマトリックスの意味は次のとおりです。

> sapply(x, function(q) { grepl(q, y) })
         a     b     c    kt
[1,]  TRUE  TRUE FALSE FALSE
[2,] FALSE FALSE FALSE FALSE
[3,] FALSE FALSE  TRUE FALSE
[4,] FALSE FALSE FALSE  TRUE
[5,] FALSE FALSE FALSE FALSE
[6,] FALSE FALSE FALSE FALSE
       ^^^^ each column is a match result for each element of x
4
Tim Biegeleisen

これも機能するはずです:

y[Reduce("+", lapply(x, grepl, y, fixed=TRUE))==0]
# [1] "kot" "kk"  "y"  
0
Sandipan Dey