data.table
Använd nycklar och index
Sök…
Introduktion
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.