2016-05-31 5 views
2

Wie ich es verstehe, vergleicht setdiff() zwei Vektoren und gibt die Elemente, die in einem Vektor auftreten, aber nicht in den anderen auftreten. Wenn das so ist, dann geben diese Vektoren ...Unerwartetes Verhalten für die Funktion setdiff() in R

thing1 <- c(1,2,3) 
thing2 <- c(2,3,4) 
thing3 <- c(1,2,3) 

... hier ist meine Ergebnisse.

setdiff(thing1,thing2) 
> [1] 1 

setdiff(thing2,thing3) 
> [1] 4 

setdiff(thing1,thing3) 
> numeric(0) 

Sollte nicht der Vergleich von thing1 und thing2 produziert das gleiche Ergebnis wie thing2 und thing3 zu vergleichen? Wie erreiche ich eine Art "Outer Join" Ergebnis (symmetrische Set-Differenz), wo wir alle Elemente sehen können, die fehlen, wenn wir unioned thing1 und thing2? Bevorzugen Sie die Funktionalität in R Basis, würde aber auch data.tables Ansatz zu schätzen wissen. Danke im Voraus.

+0

Dies ist das erwartete Verhalten von 'setdiff()', die die asymmetrische Differenz zwischen den Sätzen gibt. Siehe [docs] (http://www.inside-r.org/r-doc/base/setdiff) – user5219763

+0

'setdiff (x, y)' gibt diejenigen Mitglieder in 'x', die nicht in' y' und 'setdiff (y, x)' andersherum. Vielleicht suchen Sie nach 'union (setdiff (x, y), setdiff (y, x)) '. – 989

+0

Sie können auch 'is.element (x, y)' oder 'x% in% y' betrachten. – 989

Antwort

3

setdiff liefert asymmetrischen Unterschied. In diesem Fall macht es, was es auf der Dose sagt.

Sollte nicht der Vergleich von thing1 und thing2 produziert das gleiche Ergebnis wie thing2 und thing3 zu vergleichen?

Nun, nein. Aber es wird die gleichen Ergebnisse wie beim Vergleich thing3 und thing2 produzieren. Die Reihenfolge ist wichtig. Betrachten Sie Ihre ersten beiden Beispiele:

Das erste Beispiel fragt, was ist in thing1, die nicht in thing2 ist?

> setdiff(thing1, thing2) 
[1] 1 

Sie könnten das Gegenteil versuchen, was in thing2, die nicht in thing1 ist?

> setdiff(thing2, thing1) 
[1] 4 

Aber es scheint mir, wie die Frage ist, Sie fragen:

Welche Elemente von thing1 und thing2 nicht mit anderen geteilt werden?

Welche ist die gleiche wie:

Welche Elemente in der Vereinigung von thing1 sind und thing2, aber nicht in der Schnittstelle zwischen den beiden?

> setdiff(union(thing1, thing2), intersect(thing1, thing2)) 
[1] 1 4 
Verwandte Themen