R Language
Ustaw operacje
Szukaj…
Uwagi
Zestaw zawiera tylko jedną kopię każdego odrębnego elementu. W przeciwieństwie do niektórych innych języków programowania, baza R nie ma dedykowanego typu danych dla zestawów. Zamiast tego R traktuje wektor jak zbiór, biorąc tylko jego odrębne elementy. Dotyczy to operatorów set, setdiff
, intersect
, union
, setequal
i %in%
. Dla v %in% S
tylko S
jest traktowane jako zbiór, jednak nie wektor v
.
Dla prawdziwie ustawionego typu danych w R pakiet Rcpp udostępnia pewne opcje .
Ustaw operatory dla par wektorów
Porównywanie zestawów
W R wektor może zawierać zduplikowane elementy:
v = "A"
w = c("A", "A")
Zestaw zawiera jednak tylko jedną kopię każdego elementu. R traktuje wektor jak zbiór, biorąc tylko jego odrębne elementy, więc dwa wektory powyżej są uważane za takie same:
setequal(v, w)
# TRUE
Łączenie zestawów
Kluczowe funkcje mają naturalne nazwy:
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
Wszystkie są udokumentowane na tej samej stronie ?union
.
Ustaw członkostwo dla wektorów
Operator %in%
porównuje wektor ze zbiorem.
v = "A"
w = c("A", "A")
w %in% v
# TRUE TRUE
v %in% w
# TRUE
Każdy element po lewej stronie jest traktowany indywidualnie i testowany pod kątem członkostwa w zestawie powiązanym z wektorem po prawej stronie (składającym się ze wszystkich jego odrębnych elementów).
W przeciwieństwie do testów równości %in%
zawsze zwraca TRUE
lub FALSE
:
c(1, NA) %in% c(1, 2, 3, 4)
# TRUE FALSE
Dokumentacja znajduje się w ?`%in%`
.
Kartezjańskie lub „krzyżowe” produkty wektorów
Aby znaleźć każdy wektor formy (x, y), gdzie x jest rysowane z wektora X i y z Y, używamy 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
Wynikiem jest ramka danych z jedną kolumną dla każdego wektora przekazanego do niej. Często chcemy wziąć iloczyn kartezjański zbiorów, zamiast rozszerzać „siatkę” wektorów. Możemy użyć unique
, lapply
i 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
Zastosowanie funkcji do kombinacji
Jeśli następnie chcesz zastosować funkcję do każdej wynikowej kombinacji f(x,y)
, możesz ją dodać jako kolejną kolumnę:
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
Podejście to działa na tyle wektorów, ile potrzebujemy, ale w szczególnym przypadku dwóch, czasem lepiej jest uzyskać wynik w macierzy, co można osiągnąć za pomocą outer
:
uX = unique(X)
uY = unique(Y)
outer(setNames(uX, uX), setNames(uY, uY), `*`)
# 4 5
# 1 4 5
# 2 8 10
Aby zapoznać się z pokrewnymi pojęciami i narzędziami, zobacz temat kombinatoryczny.
Twórz unikalne / upuszczaj duplikaty / wybierz różne elementy z wektora
unique
upuszcza duplikaty, dzięki czemu każdy element w wyniku jest unikalny (pojawia się tylko raz):
x = c(2, 1, 1, 2, 1)
unique(x)
# 2 1
Wartości są zwracane w kolejności, w jakiej się pojawiły.
duplicated
tagi każdy powielony element:
duplicated(x)
# FALSE FALSE TRUE TRUE TRUE
anyDuplicated(x) > 0L
to szybki sposób sprawdzenia, czy wektor zawiera duplikaty.
Zestaw pomiarowy pokrywa się / diagramy Venna dla wektorów
Aby policzyć, ile elementów dwóch zestawów się nakłada, można napisać funkcję niestandardową:
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
Diagram Venna, oferowany przez różne pakiety, może być wykorzystany do wizualizacji nakładania się wielu zestawów.