r dataframe data.table

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 de j en [.data.frame . Incluso algo tan simple como DF[,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 de data.frame . Es un data.frame , también. Un data.table se puede pasar a cualquier paquete que solo acepte data.frame y ese paquete puede usar la sintaxis [.data.frame en data.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() y match() ahora son más rápidos en vectores de caracteres donde todos los elementos están en la CHARSXP 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 en unique. do.

Una segunda propuesta fue utilizar memcpy en duplicate.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, pero DF[3] refiere a la tercera columna
  • DT[3,] == DT[3], pero DF[,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 que DF[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 de DF[,j] que devuelve un vector de forma predeterminada
  • DT[,"colA",with=FALSE][[1]] == DF[,"colA"] .
  • DT[,colA] == DF[,"colA"]
  • DT[,list(colA)] == DF[,"colA",drop=FALSE]
  • DT[NA] devuelve 1 fila de NA, pero DF[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 probablemente DF[NA_integer_] . [.data.table hace esto automáticamente por conveniencia.
  • DT[c(TRUE,NA,FALSE)] trata el NA como FALSE, pero DF[c(TRUE,NA,FALSE)] devuelve NA rows
    para cada NA
  • DT[ColA==ColB] es más simple que DF[!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 es TRUE por defecto en data.frame pero FALSE en data.table , por conveniencia.
  • stringsAsFactors es TRUE por defecto en data.frame pero FALSE en data.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 establecemos drop=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

  • 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?