qué puedes hacer con data.frame que no puedes en data.table
dataframe (1)
De las preguntas frecuentes de data.table
Preguntas más frecuentes 1.8 Bien, estoy empezando a ver de qué se trata data.table, pero ¿por qué no mejoró data.frame en R? ¿Por qué tiene que ser un paquete nuevo?
Como se destaca la pregunta frecuente 1.1,
j
en[.data.table
es fundamentalmente diferente dej
en[.data.frame
. Incluso algo tan simple comoDF[,1]
rompería el código existente en muchos paquetes y códigos de usuario. Esto es por diseño, y queremos que funcione de esta manera para que funcione la sintaxis más complicada. También existen otras diferencias (ver la pregunta frecuente 2.17).Además,
data.table
hereda dedata.frame
. Es undata.frame
, también. Undata.table
se puede pasar a cualquier paquete que solo aceptedata.frame
y ese paquete puede usar la sintaxis[.data.frame
endata.table
.También hemos propuesto mejoras a R siempre que sea posible. Uno de estos fue aceptado como una nueva característica en R 2.12.0:
unique()
ymatch()
ahora son más rápidos en vectores de caracteres donde todos los elementos están en laCHARSXP
cachéCHARSXP
global y tienen codificación no marcada (ASCII). Gracias a Matthew Dowle por sugerir mejoras en la forma en que se genera el código hash enunique.
do.Una segunda propuesta fue utilizar
memcpy
enduplicate.c
, que es mucho más rápido que un bucle for en C. Esto mejoraría la forma en que R copia datos internamente (en algunas medidas en 13 veces). El hilo en r-devel está aquí: http://tolstoy.newcastle.edu.au/R/e10/devel/10/04/0148.html .
2.17 ¿Cuáles son las diferencias de sintaxis más pequeñas entre data.frame y data.table?
DT[3]
refiere a la tercera fila, peroDF[3]
refiere a la tercera columnaDT[3,] == DT[3],
peroDF[,3] == DF[3]
(algo confuso)- Por esta razón, decimos que la coma es opcional en DT, pero no es opcional en DF
DT[[3]] == DF[3] == DF[[3]]
DT[i,]
donde i es un entero único devuelve una sola fila, al igual queDF[i,]
, pero a diferencia de un subconjunto de una sola fila de matriz que devuelve un vector.DT[,j,with=FALSE]
donde j es un entero único devuelve una columna data.table, a diferencia deDF[,j]
que devuelve un vector de forma predeterminadaDT[,"colA",with=FALSE][[1]] == DF[,"colA"]
.DT[,colA] == DF[,"colA"]
DT[,list(colA)] == DF[,"colA",drop=FALSE]
DT[NA]
devuelve 1 fila de NA, peroDF[NA]
devuelve una copia de DF que contiene NA.- El símbolo
NA
es de tipo lógico en R y, por lo tanto, se recicla mediante[.data.frame
. La intención era probablementeDF[NA_integer_]
.[.data.table
hace esto automáticamente por conveniencia.DT[c(TRUE,NA,FALSE)]
trata el NA como FALSE, peroDF[c(TRUE,NA,FALSE)]
devuelve NA rows
para cadaNA
DT[ColA==ColB]
es más simple queDF[!is.na(ColA) & !is.na(ColB) & ColA==ColB,]
data.frame(list(1:2,"k",1:4))
crea 3 columnas,data.table
crea una columna de lista.check.names
esTRUE
por defecto endata.frame
peroFALSE
endata.table
, por conveniencia.stringsAsFactors
es TRUE por defecto endata.frame
pero FALSE endata.table
, para mayor eficiencia.- Dado que se agregó un caché de cadenas global a R, los elementos de caracteres son un puntero a la única cadena almacenada en caché y ya no existe un beneficio de rendimiento de la conversión a factor.
- Los vectores atómicos en columnas de lista se contraen cuando se imprimen usando "," en data.frame, pero "," en data.table con una coma posterior después del 6to elemento para evitar la impresión accidental de objetos incrustados grandes.
- En
[.data.frame
, a menudo establecemosdrop=FALSE
. Cuando lo olvidamos, pueden surgir errores en los casos extremos en los que se seleccionan columnas individuales y, de repente, se devuelve un vector en lugar de una sola columna data.frame. En[.data.table
, aprovechamos la oportunidad para hacerlo coherente y soltar caer.- Cuando una data.table se pasa a un paquete data.table-aware, ese paquete no se ocupa de ninguna de estas diferencias; solo funciona
Pequeña advertencia
Posiblemente habrá casos en que algunos paquetes usen código que se caiga cuando se les dé un data.frame, sin embargo, dado que data.table
se mantiene constantemente para evitar tales problemas, cualquier problema que pueda surgir se resolverá de inmediato.
Por ejemplo
De las NOTICIAS para v 1.8.2
- base :: unname (DT) ahora funciona nuevamente, según sea necesario por plyr :: melt (). Gracias a Christoph Jaeckel por informar. Prueba agregada
- Se ha agregado un método as.data.frame para ITime, de modo que ITime se pueda pasar a ggplot2 sin error, # 1713. Gracias a Farrel Buchinsky por informar. Pruebas agregadas. Las etiquetas de los ejes de tiempo aún se muestran como segundos enteros a partir de la medianoche; no sabemos por qué ggplot2 no invoca el método as.character de ITime. Convierta ITime a POSIXct para ggplot2, es un enfoque.
Empecé a usar R y encontré data.table. Lo encontré brillante.
Una pregunta muy ingenua: ¿Puedo ignorar data.frame para usar data.table para evitar la confusión de sintaxis entre dos paquetes?