R Language
Operationen einstellen
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.