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.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow