Zoeken…


Opmerkingen

Een set bevat slechts één kopie van elk afzonderlijk element. In tegenstelling tot sommige andere programmeertalen heeft base R geen specifiek gegevenstype voor sets. In plaats daarvan behandelt R een vector als een set door alleen de afzonderlijke elementen ervan te nemen. Dit geldt voor de set-operators, setdiff , intersect , union , setequal en %in% . Voor v %in% S wordt alleen S als een set behandeld, maar niet de vector v .

Voor een echt ingesteld gegevenstype in R biedt het Rcpp-pakket enkele opties .

Stel operators in voor paren van vectoren

Sets vergelijken

In R kan een vector dubbele elementen bevatten:

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

Een set bevat echter slechts één kopie van elk element. R behandelt een vector als een set door alleen de afzonderlijke elementen ervan te nemen, dus de twee bovenstaande vectoren worden als dezelfde beschouwd:

setequal(v, w)
# TRUE

Sets combineren

De belangrijkste functies hebben natuurlijke 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

Deze zijn allemaal gedocumenteerd op dezelfde pagina ?union .

Stel lidmaatschap in voor vectoren

De operator %in% vergelijkt een vector met een set.

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

w %in% v
# TRUE TRUE

v %in% w
# TRUE

Elk element aan de linkerkant wordt afzonderlijk behandeld en getest op lidmaatschap in de set die is gekoppeld aan de vector aan de rechterkant (bestaande uit alle afzonderlijke elementen).

In tegenstelling tot gelijkheidstests, geeft %in% altijd TRUE of FALSE :

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

De documentatie is op ?`%in%` .

Cartesiaanse of "kruis" producten van vectoren

Om elke vector van de vorm (x, y) te vinden waar x wordt getrokken uit vector X en y uit Y, gebruiken we 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

Het resultaat is een data.frame met één kolom voor elke vector die eraan wordt doorgegeven. Vaak willen we het Cartesiaanse product van sets nemen in plaats van een "raster" van vectoren uit te breiden. We kunnen unique , lapply en 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

Functies toepassen op combinaties

Als u vervolgens een functie wilt toepassen op elke resulterende combinatie f(x,y) , kan deze worden toegevoegd als een andere kolom:

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

Deze benadering werkt voor zoveel vectoren als we nodig hebben, maar in het speciale geval van twee is het soms beter geschikt om het resultaat in een matrix te hebben, die kan worden bereikt met de outer :

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

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

#   4  5
# 1 4  5
# 2 8 10

Zie het onderwerp combinatoriek voor gerelateerde concepten en hulpmiddelen.

Maak unieke / zet duplicaten neer / selecteer verschillende elementen uit een vector

unique laat duplicaten vallen zodat elk element in het resultaat uniek is (verschijnt slechts eenmaal):

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

unique(x)
# 2 1

Waarden worden geretourneerd in de volgorde waarin ze voor het eerst zijn verschenen.

duplicated tags elk gedupliceerd element:

duplicated(x)
# FALSE FALSE TRUE TRUE TRUE

anyDuplicated(x) > 0L is een snelle manier om te controleren of een vector duplicaten bevat.

Meetoverlappingen / Venn-diagrammen voor vectoren

Om te tellen hoeveel elementen van twee sets elkaar overlappen, zou je een aangepaste functie kunnen schrijven:

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

Een Venn-diagram, aangeboden door verschillende pakketten, kan worden gebruikt om overlappende tellingen over meerdere sets te visualiseren.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow