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?

Antworten:


121

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

> setdiff(x, y)
[1] 1

35
Achtung: setdiff(x,y)und setdiff(y,x)sind nicht gleich.
Xi'an


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


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

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.