Sto usando data.table e ci sono molte funzioni che richiedono di impostare una chiave (ad esempio X[Y]
). Come tale, desidero capire cosa fa una chiave per impostare correttamente le chiavi nelle mie tabelle di dati.
Una fonte che ho letto è stata ?setkey
.
setkey()
ordina undata.table
e lo contrassegna come ordinato. Le colonne ordinate sono la chiave. La chiave può essere qualsiasi colonna in qualsiasi ordine. Le colonne sono sempre ordinate in ordine crescente. La tabella viene modificata per riferimento. Non viene eseguita alcuna copia, a parte la memoria di lavoro temporanea grande quanto una colonna.
La mia conclusione qui è che una chiave "ordinerebbe" data.table, ottenendo un effetto molto simile a order()
. Tuttavia, non spiega lo scopo di avere una chiave.
Le FAQ di data.table 3.2 e 3.3 spiegano:
3.2 Non ho una chiave su un tavolo grande, ma il raggruppamento è comunque molto veloce. Perché?
data.table utilizza l'ordinamento digitale. Questo è notevolmente più veloce di altri algoritmi di ordinamento. Radix è specificatamente solo per interi, vedi
?base::sort.list(x,method="radix")
. Questo è anche uno dei motivi per cuisetkey()
è veloce. Quando non è impostata alcuna chiave, o raggruppiamo in un ordine diverso da quello della chiave, la chiamiamo ad hoc by.3.3 Perché il raggruppamento per colonne nella chiave è più veloce di un raggruppamento ad hoc per?
Poiché ogni gruppo è contiguo nella RAM, riducendo così al minimo i recuperi di pagina, e la memoria può essere copiata in blocco (
memcpy
in C) anziché in loop in C.
Da qui, immagino che l'impostazione di una chiave in qualche modo consenta a R di usare "radix sorting" rispetto ad altri algoritmi, ed è per questo che è più veloce.
La guida rapida di 10 minuti ha anche una guida sui tasti.
- chiavi
Cominciamo considerando data.frame, specically rownames (o in inglese, nomi di riga). Cioè, i nomi multipli che appartengono a una singola riga. I nomi multipli che appartengono alla singola riga? Non è quello a cui siamo abituati in un data.frame. Sappiamo che ogni riga ha al massimo un nome. Una persona ha almeno due nomi, un primo nome e un secondo nome. Ciò è utile per organizzare un elenco telefonico, ad esempio, ordinato per cognome, quindi per primo. Tuttavia, ogni riga in un data.frame può avere un solo nome.
Una chiave è costituita da una o più colonne di nomi utente, che possono essere interi, fattori, caratteri o qualche altra classe, non semplicemente caratteri. Inoltre, le righe vengono ordinate in base alla chiave. Pertanto, un data.table può avere al massimo una chiave, perché non può essere ordinato in più di un modo.
L'unicità non viene applicata, ovvero sono consentiti valori chiave duplicati. Poiché le righe sono ordinate in base alla chiave, eventuali duplicati nella chiave appariranno consecutivamente
L'elenco telefonico è stato utile per capire cos'è una chiave, ma sembra che una chiave non sia diversa rispetto alla colonna dei fattori. Inoltre, non spiega perché è necessaria una chiave (soprattutto per utilizzare determinate funzioni) e come scegliere la colonna da impostare come chiave. Inoltre, sembra che in un data.table con il tempo come colonna, l'impostazione di qualsiasi altra colonna come chiave probabilmente rovinerebbe anche la colonna del tempo, il che la rende ancora più confusa poiché non so se mi è permesso impostare qualsiasi altra colonna come chiave. Qualcuno può illuminarmi per favore?