R Language
Bewerkingen instellen
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.