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 y
ist, 1 ist?
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 y
ist, 1 ist?
Antworten:
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 .
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
x[is.na(match(x,y))]
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
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 x
nicht 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 y
oder 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
setdiff(x,y)
undsetdiff(y,x)
sind nicht gleich.