Estoy usando data.table y hay muchas funciones que requieren que establezca una clave (por ejemplo X[Y]
). Como tal, deseo comprender qué hace una clave para configurar correctamente las claves en mis tablas de datos.
Una fuente que leí fue ?setkey
.
setkey()
ordena undata.table
y lo marca como ordenado. Las columnas ordenadas son la clave. La clave puede ser cualquier columna en cualquier orden. Las columnas se ordenan siempre en orden ascendente. La tabla se cambia por referencia. No se realiza ninguna copia, salvo la memoria de trabajo temporal de una columna.
Mi conclusión aquí es que una clave "ordenaría" la tabla de datos, lo que resultaría en un efecto muy similar a order()
. Sin embargo, no explica el propósito de tener una clave.
Las preguntas frecuentes 3.2 y 3.3 de data.table explica:
3.2 No tengo una clave en una mesa grande, pero la agrupación es muy rápida. ¿Porqué es eso?
data.table utiliza la clasificación de radix. Esto es significativamente más rápido que otros algoritmos de clasificación. Radix es específicamente solo para enteros, consulte
?base::sort.list(x,method="radix")
. Esta es también una de las razones por las quesetkey()
es rápido. Cuando no se establece ninguna clave, o lo agrupamos en un orden diferente al de la clave, lo llamamos ad hoc by.3.3 ¿Por qué el agrupamiento por columnas en la clave es más rápido que un ad hoc por?
Debido a que cada grupo es contiguo en la RAM, lo que minimiza las búsquedas de páginas, y la memoria se puede copiar a granel (
memcpy
en C) en lugar de realizar un bucle en C.
A partir de aquí, supongo que establecer una clave de alguna manera le permite a R usar "ordenación de radix" sobre otros algoritmos, y por eso es más rápido.
La guía de inicio rápido de 10 minutos también tiene una guía sobre las teclas.
- Llaves
Comencemos considerando data.frame, específicamente nombres de filas (o en inglés, nombres de filas). Es decir, los múltiples nombres que pertenecen a una sola fila. ¿Los múltiples nombres que pertenecen a una sola fila? Eso no es a lo que estamos acostumbrados en un data.frame. Sabemos que cada fila tiene como máximo un nombre. Una persona tiene al menos dos nombres, un primer nombre y un segundo nombre. Esto es útil para organizar un directorio telefónico, por ejemplo, que se ordena por apellido y luego por nombre. Sin embargo, cada fila de un data.frame solo puede tener un nombre.
Una clave consta de una o más columnas de nombres de filas, que pueden ser números enteros, factores, caracteres o alguna otra clase, no simplemente caracteres. Además, las filas están ordenadas por clave. Por lo tanto, una tabla de datos puede tener como máximo una clave, porque no se puede ordenar de más de una forma.
La unicidad no se aplica, es decir, se permiten valores de clave duplicados. Dado que las filas están ordenadas por clave, cualquier duplicado en la clave aparecerá consecutivamente
El directorio telefónico fue útil para comprender qué es una clave, pero parece que una clave no es diferente en comparación con tener una columna de factores. Además, no explica por qué se necesita una clave (especialmente para usar ciertas funciones) y cómo elegir la columna para establecer como clave. Además, parece que en una tabla de datos con el tiempo como columna, establecer cualquier otra columna como clave probablemente también estropearía la columna de tiempo, lo que lo hace aún más confuso ya que no sé si se me permite establecer cualquier otra columna como llave. Alguien puede iluminarme, por favor?