2016-11-30 12 views
4

内の特定の文字を含む文字列のベクトルからエントリを削除します。私は2つの文字のベクトルを持っているR

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

私はのいずれかを含まない文字列だけようにYからエントリを削除するには、Xを使用する必要がありますがxの項目は次のように残ります。

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

このコードは、任意のサイズのベクトルxとyに対して機能するはずです。

これまではgsubとgreplを使用しようとしましたが、これらは単一の文字列でしか動作しません。私はこれを行うループを作成しようとしましたが、問題は思ったよりも難しいようです。もちろん、解が洗練されていればいいほど良いですが、ベクトルxとyには最大200個のエントリがあると仮定できます。

答えて

4

我々はy試合でxにパターンをどの値を見つけるためにgrepを使用して、それがブールベクトル

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

返すようgrepl!%in%

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

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

またはより良いを使用してそれらを除外することができます@Ronakによって与えられた答えは鉱山よりも好ましいと思われますが、sapplygreplを使用してyxの各エントリに対して、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 
+1

グレートオプション。一を足す。比較するベクトル要素の数が膨大で、grepが正常に動作しない場合、これはもっと良いでしょう。 – akrun

+0

私はakrunに同意します。これは非常に便利ですが、この場合、私のベクトルのgrepl-solutionはそれほど長くはありません。 – Lecromine

0

また、これは動作するはずです:

y[Reduce("+", lapply(x, grepl, y, fixed=TRUE))==0] 
# [1] "kot" "kk" "y" 
関連する問題