Wie kann man erkennen, was sich in einem Vektor befindet und nicht in einem anderen?

85

In matlab gibt es eine Möglichkeit, die Werte in einem Vektor zu finden, aber nicht in dem anderen.

beispielsweise:

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

Gibt es eine Funktion, die mir sagen würde, dass der Wert in x, der nicht in yist, 1 ist?

Tony Stark
quelle

Antworten:

121

Sie können die Funktion setdiff () (Set Difference) verwenden:

> setdiff(x, y)
[1] 1
Xela
quelle
35
Achtung: setdiff(x,y)und setdiff(y,x)sind nicht gleich.
Xi'an
56

Ja. Für Vektoren können Sie einfach den %in%Operator oder die is.element()Funktion verwenden.

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

Für eine Matrix gibt es viele unterschiedliche Ansätze. merge()ist wahrscheinlich die direkteste. Ich schlage vor , diese Frage für dieses Szenario zu betrachten .

Shane
quelle
28

Die Hilfedatei in R für setdiff, union, intersect, setequal und is.element enthält Informationen zu den Standard-Set-Funktionen in R.

setdiff(x, y)gibt die Elemente zurück x, die nicht in sind y.

Wie oben erwähnt, handelt es sich um einen asymmetrischen Unterschied. Also zum Beispiel:

> 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
Jeromy Anglim
quelle
12
x[is.na(match(x,y))]
George Dontas
quelle
5

setdiff()ist eine schwierige Funktion, da die Ausgabe von der Reihenfolge der Eingabe abhängt. Sie können stattdessen eine einfache Funktion als solche schreiben, die genau das Gegenteil von bewirkt intersect. Das ist weitaus besser.

>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
Arbeitstier
quelle
2

Wenn:

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

Jeder dieser Ausdrücke:

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

gibt Ihnen die richtige Antwort [1] 1, wenn das Ziel darin besteht, die Werte / Zeichen in zu finden, die in xnicht vorhanden sind y.

Das Anwenden der obigen Ausdrücke kann jedoch schwierig sein und je nach Art des Vektors und der Position von x und y im Ausdruck unerwünschte Ergebnisse liefern. Zum Beispiel, wenn:

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

und das Ziel ist nur, die eindeutigen Werte / Zeichen in zu finden x, die in nicht vorhanden sind yoder umgekehrt. Wenn Sie einen dieser Ausdrücke anwenden, erhalten Sie immer noch die richtige Antwort [1] 1:

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

Dank des Beitrags von Jeromy Anglim

ODER:

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

Dank des Beitrags von Workhouse

Wilhelm
quelle