Suche…


Bemerkungen

Ein Set enthält nur eine Kopie jedes einzelnen Elements. Im Gegensatz zu anderen Programmiersprachen verfügt Base R nicht über einen dedizierten Datentyp für Sätze. Stattdessen behandelt R einen Vektor wie eine Menge, indem nur seine verschiedenen Elemente genommen werden. Dies gilt für die Mengenoperatoren setdiff , intersect , union , setequal und %in% . Für v %in% S wird nur S als Menge behandelt, nicht jedoch der Vektor v .

Für einen True Set-Datentyp in R bietet das Rcpp-Paket einige Optionen .

Legen Sie Operatoren für Vektorpaare fest

Sets vergleichen

In R kann ein Vektor doppelte Elemente enthalten:

v = "A"
w = c("A", "A")

Ein Satz enthält jedoch nur eine Kopie jedes Elements. R behandelt einen Vektor wie eine Menge, indem nur seine unterschiedlichen Elemente genommen werden, sodass die beiden obigen Vektoren als gleich betrachtet werden

setequal(v, w)
# TRUE

Sets kombinieren

Die Schlüsselfunktionen haben natürliche Namen:

x = c(1, 2, 3)
y = c(2, 4)

union(x, y)
# 1 2 3 4

intersect(x, y)
# 2

setdiff(x, y)
# 1 3

Diese sind alle auf derselben Seite ( ?union dokumentiert.

Legen Sie die Mitgliedschaft für Vektoren fest

Der Operator %in% vergleicht einen Vektor mit einer Menge.

v = "A"
w = c("A", "A")

w %in% v
# TRUE TRUE

v %in% w
# TRUE

Jedes Element auf der linken Seite wird einzeln behandelt und auf Mitgliedschaft in der Menge geprüft, die dem Vektor auf der rechten Seite zugeordnet ist (bestehend aus allen seinen verschiedenen Elementen).

Im Gegensatz zu Gleichheitstests gibt %in% immer TRUE oder FALSE :

c(1, NA) %in% c(1, 2, 3, 4)
# TRUE FALSE

Die Dokumentation liegt bei ?`%in%` .

Kartesische oder "Kreuz" -Produkte von Vektoren

Um jeden Vektor der Form (x, y) zu finden, in dem x vom Vektor X und y von Y gezeichnet wird, verwenden wir expand.grid :

X = c(1, 1, 2)
Y = c(4, 5)

expand.grid(X, Y)

#   Var1 Var2
# 1    1    4
# 2    1    4
# 3    2    4
# 4    1    5
# 5    1    5
# 6    2    5

Das Ergebnis ist ein data.frame mit einer Spalte für jeden übergebenen Vektor. Oft wollen wir das kartesische Produkt von Mengen nehmen, anstatt ein "Gitter" von Vektoren zu erweitern. Wir können unique , lapply und do.call :

m = do.call(expand.grid, lapply(list(X, Y), unique))

#   Var1 Var2
# 1    1    4
# 2    2    4
# 3    1    5
# 4    2    5

Funktionen auf Kombinationen anwenden

Wenn Sie dann auf jede resultierende Kombination f(x,y) eine Funktion anwenden möchten, kann diese als weitere Spalte hinzugefügt werden:

m$p = with(m, Var1*Var2)
#   Var1 Var2  p
# 1    1    4  4
# 2    2    4  8
# 3    1    5  5
# 4    2    5 10

Dieser Ansatz funktioniert für so viele Vektoren, wie wir brauchen, aber im speziellen Fall von zwei ist es manchmal besser, das Ergebnis in einer Matrix zu haben, die mit outer erreicht werden kann:

uX = unique(X)
uY = unique(Y)

outer(setNames(uX, uX), setNames(uY, uY), `*`)

#   4  5
# 1 4  5
# 2 8 10

Zu verwandten Konzepten und Werkzeugen siehe das Thema Kombinatorik.

Erstellen Sie eindeutige Elemente, und legen Sie doppelte Elemente aus einem Vektor ab

unique legt Duplikate ab, sodass jedes Element im Ergebnis eindeutig ist (nur einmal erscheint):

x = c(2, 1, 1, 2, 1)

unique(x)
# 2 1

Die Werte werden in der Reihenfolge zurückgegeben, in der sie zuerst angezeigt wurden.

duplicated Tags für jedes duplizierte Element:

duplicated(x)
# FALSE FALSE TRUE TRUE TRUE

anyDuplicated(x) > 0L schnell überprüfen, ob ein Vektor Duplikate enthält.

Messsatzüberdeckungen / Venn-Diagramme für Vektoren

Um zu zählen, wie viele Elemente von zwei Sätzen sich überlappen, könnte man eine benutzerdefinierte Funktion schreiben:

xtab_set <- function(A, B){
    both    <-  union(A, B)
    inA     <-  both %in% A
    inB     <-  both %in% B
    return(table(inA, inB))
}

A = 1:20
B = 10:30

xtab_set(A, B)

#        inB
# inA     FALSE TRUE
#   FALSE     0   10
#   TRUE      9   11

Ein Venn-Diagramm, das von verschiedenen Paketen angeboten wird, kann verwendet werden, um Überlappungszählungen über mehrere Sätze hinweg zu visualisieren.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow