R Language
Ställ in operationer
Sök…
Anmärkningar
En uppsättning innehåller bara en kopia av varje distinkt element. Till skillnad från vissa andra programmeringsspråk har bas R inte någon dedicerad datatyp för uppsättningar. Istället behandlar R en vektor som en uppsättning genom att bara ta sina distinkta element. Detta gäller inställda operatörer, setdiff
, intersect
, union
, setequal
och %in%
. För v %in% S
behandlas endast S
som en uppsättning, dock inte vektorn v
.
För en riktig uppsatt datatyp i R, ger Rcpp-paketet några alternativ .
Ställ in operatörer för par av vektorer
Jämföra uppsättningar
I R kan en vektor innehålla duplicerade element:
v = "A"
w = c("A", "A")
En uppsättning innehåller dock bara en kopia av varje element. R behandlar en vektor som en uppsättning genom att endast ta sina distinkta element, så de två vektorerna ovan betraktas som samma:
setequal(v, w)
# TRUE
Kombinera uppsättningar
Nyckelfunktionerna har naturliga namn:
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
Dessa är alla dokumenterade på samma sida ?union
.
Ställ in medlemskap för vektorer
Operatören %in%
jämför en vektor med en uppsättning.
v = "A"
w = c("A", "A")
w %in% v
# TRUE TRUE
v %in% w
# TRUE
Varje element till vänster behandlas individuellt och testas för medlemskap i uppsättningen associerad med vektorn till höger (bestående av alla dess distinkta element).
Till skillnad från jämställdhetstester returnerar %in%
alltid TRUE
eller FALSE
:
c(1, NA) %in% c(1, 2, 3, 4)
# TRUE FALSE
Dokumentationen är på ?`%in%`
.
Kartesiska eller "korsade" produkter av vektorer
För att hitta alla vektorer i formen (x, y) där x dras från vektorn X och y från Y, använder vi 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
Resultatet är ett data.frame med en kolumn för varje vektor som skickas till den. Ofta vill vi ta den kartesiska produkten av uppsättningar snarare än att utöka ett "rutnät" av vektorer. Vi kan använda unique
, lapply
och 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
Tillämpa funktioner på kombinationer
Om du sedan vill använda en funktion på varje resulterande kombination f(x,y)
kan den läggas till som en annan 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
Detta tillvägagångssätt fungerar för så många vektorer som vi behöver, men i det speciella fallet för två är det ibland en bättre passform att få resultatet i en matris, som kan uppnås med outer
:
uX = unique(X)
uY = unique(Y)
outer(setNames(uX, uX), setNames(uY, uY), `*`)
# 4 5
# 1 4 5
# 2 8 10
För relaterade begrepp och verktyg, se kombinatorikämnet.
Gör unika / släpp dubbletter / välj distinkta element från en vektor
unique
droppar duplicerar så att varje element i resultatet är unikt (visas bara en gång):
x = c(2, 1, 1, 2, 1)
unique(x)
# 2 1
Värdena returneras i den ordning de först visade.
duplicated
taggar varje duplicerat element:
duplicated(x)
# FALSE FALSE TRUE TRUE TRUE
anyDuplicated(x) > 0L
är ett snabbt sätt att kontrollera om en vektor innehåller några dubbletter.
Mät uppsättning överlappningar / Venn-diagram för vektorer
För att räkna hur många element i två uppsättningar som överlappar, kan man skriva en anpassad funktion:
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
Ett Venn-diagram, som erbjuds av olika paket, kan användas för att visualisera överlappningsräkningar över flera uppsättningar.