Sök…


Introduktion

Nyckeln och indexen för en data.tabell gör att vissa beräkningar kan köras snabbare, mestadels relaterade till sammanfogningar och underinställningar. Knappen beskriver tabellens aktuella sorteringsordning; medan varje index lagrar information om tabellens ordning med respekt för en kolumnsekvens. Se avsnittet "Kommentarer" nedan för länkar till de officiella vinjetterna om ämnet.

Anmärkningar

De officiella vinjetterna är den bästa introduktionen till detta ämne:

Nycklar kontra index

En datatabell kan "tangenteras" med en sekvens av kolumner, berätta intresserade funktioner att data sorteras efter dessa kolumner. För att få eller ställa in nyckeln använder du funktionerna dokumenterade på ?key .

På liknande sätt kan funktioner dra nytta av en data.tabells "index". Varje index - och en tabell kan ha mer än en - lagrar information om datorns ordning med avseende på en kolumnsekvens. Som en nyckel kan ett index snabba upp vissa uppgifter. För att få eller ställa in index använder du funktionerna som är dokumenterade vid ?indices .

Index kan också ställas in automatiskt (för närvarande endast för en enda kolumn åt gången). Se ?datatable.optimize för detaljer om hur detta fungerar och hur du kan inaktivera det vid behov.

Verifiering och uppdatering

Värden som saknas är tillåtna i en nyckelkolumn.

Nycklar och index lagras som attribut och kan av misstag inte motsvara den faktiska ordningsföljden i tabellen. Många funktioner kontrollerar giltigheten för nyckeln eller indexet innan du använder den, men det är värt att komma ihåg.

Nycklar och index tas bort efter uppdateringar där det inte är uppenbart att sorteringsordningen bevaras. Till exempel, från DT = data.table(a=c(1,2,4), key="a") , om vi uppdaterar som DT[2, a := 3] , bryts nyckeln.

Förbättra prestanda för att välja undergrupper

# example data
set.seed(1)
n  = 1e7
ng = 1e4
DT = data.table(
    g1  = sample(ng, n, replace=TRUE),
    g2  = sample(ng, n, replace=TRUE),
    v  = rnorm(n)
)

Matchar i en kolumn

Efter den första körningen av en delinställning med == eller %in% ...

system.time(
    DT[ g1 %in% 1:100]
)
#    user  system elapsed 
#    0.12    0.03    0.16 

Ett index har skapats automatiskt för g1 . Efterföljande delavsättningar körs nästan omedelbart:

system.time(
    DT[ g1 %in% 1:100]
)
#    user  system elapsed 
#       0       0       0

För att övervaka när ett index skapas eller används, lägg till alternativet verbose=TRUE eller ändra de globala inställningsalternativen options(datatable.verbose=TRUE) .

Matchning på flera kolumner

För närvarande skapar inte matchning på två kolumner automatiskt ett index:

system.time(
    DT[ g1 %in% 1:100 & g2 %in% 1:100]
)
#    user  system elapsed 
#    0.57    0.00    0.57

Kör igen detta och det kommer att förbli långsamt. Även om vi manuellt lägger till indexet med setindex(DT, g1, g2) , kommer det att förbli långsamt eftersom denna fråga ännu inte är optimerad av paketet.

Lyckligtvis, om vi kan räkna upp de kombinationer av värden som vi vill söka efter och ett index finns, kan vi snabbt jämföra:

system.time(
    DT[ CJ(g1 = 1:100, g2 = 1:100, unique=TRUE), on=.(g1, g2), nomatch=0]
)
#    user  system elapsed 
#    0.53    0.00    0.54 
setindex(DT, g1, g2)
system.time(
    DT[ CJ(g1 = 1:100, g2 = 1:100, unique=TRUE), on=.(g1, g2), nomatch=0]
)
#    user  system elapsed 
#       0       0       0

Med CJ är det viktigt att se upp för antalet kombinationer som blir för stora.



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