あるベクトルに何があり、別のベクトルにはないかを知る方法は?


86

matlabには、一方のベクトルで値を検索する方法がありますが、もう一方のベクトルでは検索できません。

例えば:

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

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

回答:


122

setdiff()(set Difference)関数を使用できます。

> setdiff(x, y)
[1] 1

37
注意:setdiff(x,y)setdiff(y,x)は同じではありません。
西安




5

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

2

場合:

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

これらの式のいずれか:

setdiff(x, y)
x[!(x %in% y)]
x[is.na(match(x,y))]
x[!(is.element(x,y))]

に存在しない[1] 1値/文字を見つけることが目標である場合、正しい答えが得られます。xy

ただし、上記の式を適用するのは難しい場合があり、ベクトルの性質、および式内のxとyの位置によっては、望ましくない結果が生じる可能性があります。たとえば、次の場合:

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

目標はx、に存在しない、yまたはその逆の一意の値/文字を見つけることだけです。これらの式のいずれかを適用しても、正しい答えが得られます[1] 1

union(setdiff(x, y), setdiff(y, x))

ジェロミー・アングリムの貢献に感謝します

または:

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

Workhouseの貢献に感謝します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.