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.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow