web-dev-qa-db-ja.com

あるベクターに含まれるものが別のベクターには含まれていないことを確認するにはどうすればよいですか?

Matlabには、1つのベクトルの値を検索する方法がありますが、他のベクトルの値は検索しません。

例えば:

x <- c(1,2,3,4)
y <- c(2,3,4)

xにないyの値が1であることを教えてくれる関数はありますか?

72
Tony Stark

setdiff()(差の設定)関数を使用できます。

> setdiff(x, y)
[1] 1
103
Xela

はい。ベクトルの場合は、単に_%in%_演算子またはis.element()関数を使用できます。

_> x[!(x %in% y)]
1
_

マトリックスには、多くの異なるアプローチがあります。 merge()はおそらく最も単純です。 そのシナリオのこの質問を見る をお勧めします。

53
Shane

setdiff、union、intersect、setequal、およびis.element のRのヘルプファイルは、Rの標準セット関数に関する情報を提供します。

setdiff(x, y)は、xにないyの要素を返します。

上記のように、それは非対称の違いです。たとえば、次のとおりです。

> x <- c(1,2,3,4)
> y <- c(2,3,4,5)
> 
> setdiff(x, y)
[1] 1
> setdiff(y, x)
[1] 5
> union(setdiff(x, y), setdiff(y, x))
[1] 1 5
26
Jeromy Anglim
x[is.na(match(x,y))]
12
George Dontas

setdiff()は、出力が入力の順序に依存するため、扱いにくい関数です。代わりに、intersectとは正反対の単純な関数を作成できます。これははるかに優れています。

>difference <- function(x, y) {
c(setdiff(x, y), setdiff(y, x))
}

#Now lets test it. 
>x <- c(1,2,3,4)
>y <- c(2,3,4,5)

>difference(x,y)
[1] 1 5
4
Workhorse