data.table
Informes estadísticos de resumen.
Buscar..
Observaciones
Un recordatorio: la sintaxis de DT[where, select|update|do, by]
se utiliza para trabajar con columnas de una tabla de datos.
- La parte "donde" es el argumento
i
- La parte "seleccionar | actualizar | hacer" es el argumento
j
Estos dos argumentos generalmente se pasan por posición en lugar de por nombre.
Contando filas por grupo
# example data
DT = data.table(iris)
DT[, Bin := cut(Sepal.Length, c(4,6,8))]
Utilizando .N
.N
en j
almacena el número de filas en un subconjunto. Al explorar datos, .N
es útil para ...
contar filas en un grupo,
DT[Species == "setosa", .N] # 50
o contar filas en todos los grupos,
DT[, .N, by=.(Species, Bin)] # Species Bin N # 1: setosa (4,6] 50 # 2: versicolor (6,8] 20 # 3: versicolor (4,6] 30 # 4: virginica (6,8] 41 # 5: virginica (4,6] 9
o encuentra grupos que tengan un cierto número de filas.
DT[, .N, by=.(Species, Bin)][ N < 25 ] # Species Bin N # 1: versicolor (6,8] 20 # 2: virginica (4,6] 9
Manejo de grupos faltantes
Sin embargo, faltan grupos con un conteo de cero arriba. Si importan, podemos usar la table
desde la base:
DT[, data.table(table(Species, Bin))][ N < 25 ]
# Species Bin N
# 1: virginica (4,6] 9
# 2: setosa (6,8] 0
# 3: versicolor (6,8] 20
Alternativamente, podemos unirnos en todos los grupos:
DT[CJ(Species=Species, Bin=Bin, unique=TRUE), on=c("Species","Bin"), .N, by=.EACHI][N < 25]
# Species Bin N
# 1: setosa (6,8] 0
# 2: versicolor (6,8] 20
# 3: virginica (4,6] 9
Una nota en .N
:
- Este ejemplo utiliza
.N
enj
, donde se refiere al tamaño de un subconjunto. - En
i
, se refiere al número total de filas.
Resúmenes personalizados
# example data
DT = data.table(iris)
DT[, Bin := cut(Sepal.Length, c(4,6,8))]
Supongamos que queremos la salida de la función de summary
para Sepal.Length
junto con el número de observaciones:
DT[, c(
as.list(summary(Sepal.Length)),
N = .N
), by=.(Species, Bin)]
# Species Bin Min. 1st Qu. Median Mean 3rd Qu. Max. N
# 1: setosa (4,6] 4.3 4.8 5.0 5.006 5.2 5.8 50
# 2: versicolor (6,8] 6.1 6.2 6.4 6.450 6.7 7.0 20
# 3: versicolor (4,6] 4.9 5.5 5.6 5.593 5.8 6.0 30
# 4: virginica (6,8] 6.1 6.4 6.7 6.778 7.2 7.9 41
# 5: virginica (4,6] 4.9 5.7 5.8 5.722 5.9 6.0 9
Tenemos que hacer j
una lista de columnas. Por lo general, algunos juegan con c
, as.list
y .
es suficiente para averiguar la forma correcta de proceder.
Asignación de estadísticas de resumen como nuevas columnas.
En lugar de hacer una tabla de resumen, es posible que desee almacenar una estadística de resumen en una nueva columna. Podemos usar :=
como siempre. Por ejemplo,
DT[, is_big := .N >= 25, by=.(Species, Bin)]
Escollos
Datos desordenados
Si te encuentras con ganas de analizar los nombres de las columnas, como
Tome la media de
x.Length/x.Width
dondex
toma diez valores diferentes.
entonces es probable que esté viendo datos incrustados en nombres de columna, lo cual es una mala idea. Lea acerca de los datos ordenados y luego cambie a formato largo.
Resúmenes de Rowwise
Los marcos de datos y data.tables están bien diseñados para datos tabulares, donde las filas corresponden a observaciones y columnas a variables. Si te encuentras con ganas de resumir sobre filas, como
Encuentra la desviación estándar a través de columnas para cada fila.
entonces probablemente deberías usar una matriz o algún otro formato de datos por completo.
La función de resumen
# example data
DT = data.table(iris)
DT[, Bin := cut(Sepal.Length, c(4,6,8))]
summary
es útil para navegar por las estadísticas de resumen. Además del uso directo como summary(DT)
, también se puede aplicar por grupo convenientemente con split
:
lapply(split(DT, by=c("Species", "Bin"), drop=TRUE, keep.by=FALSE), summary)
# $`setosa.(4,6]`
# Sepal.Length Sepal.Width Petal.Length Petal.Width
# Min. :4.300 Min. :2.300 Min. :1.000 Min. :0.100
# 1st Qu.:4.800 1st Qu.:3.200 1st Qu.:1.400 1st Qu.:0.200
# Median :5.000 Median :3.400 Median :1.500 Median :0.200
# Mean :5.006 Mean :3.428 Mean :1.462 Mean :0.246
# 3rd Qu.:5.200 3rd Qu.:3.675 3rd Qu.:1.575 3rd Qu.:0.300
# Max. :5.800 Max. :4.400 Max. :1.900 Max. :0.600
#
# $`versicolor.(6,8]`
# Sepal.Length Sepal.Width Petal.Length Petal.Width
# Min. :6.10 Min. :2.20 Min. :4.000 Min. :1.20
# 1st Qu.:6.20 1st Qu.:2.80 1st Qu.:4.400 1st Qu.:1.30
# Median :6.40 Median :2.90 Median :4.600 Median :1.40
# Mean :6.45 Mean :2.89 Mean :4.585 Mean :1.42
# 3rd Qu.:6.70 3rd Qu.:3.10 3rd Qu.:4.700 3rd Qu.:1.50
# Max. :7.00 Max. :3.30 Max. :5.000 Max. :1.70
#
# [...results truncated...]
Para incluir grupos de conteo cero, establezca drop=FALSE
en split
.
Aplicando una función de resumen a múltiples variables.
# example data
DT = data.table(iris)
DT[, Bin := cut(Sepal.Length, c(4,6,8))]
Para aplicar la misma función de resumen a cada columna por grupo, podemos usar lapply
y .SD
DT[, lapply(.SD, median), by=.(Species, Bin)]
# Species Bin Sepal.Length Sepal.Width Petal.Length Petal.Width
# 1: setosa (4,6] 5.0 3.4 1.50 0.2
# 2: versicolor (6,8] 6.4 2.9 4.60 1.4
# 3: versicolor (4,6] 5.6 2.7 4.05 1.3
# 4: virginica (6,8] 6.7 3.0 5.60 2.1
# 5: virginica (4,6] 5.8 2.7 5.00 1.9
Podemos filtrar las columnas en .SD
con el argumento .SDcols
:
DT[, lapply(.SD, median), by=.(Species, Bin), .SDcols="Petal.Length"]
# Species Bin Petal.Length
# 1: setosa (4,6] 1.50
# 2: versicolor (6,8] 4.60
# 3: versicolor (4,6] 4.05
# 4: virginica (6,8] 5.60
# 5: virginica (4,6] 5.00
Múltiples funciones de resumen.
Actualmente, la extensión más simple a múltiples funciones es quizás:
DT[, unlist(recursive=FALSE, lapply(
.(med = median, iqr = IQR),
function(f) lapply(.SD, f)
)), by=.(Species, Bin), .SDcols=Petal.Length:Petal.Width]
# Species Bin med.Petal.Length med.Petal.Width iqr.Petal.Length iqr.Petal.Width
# 1: setosa (4,6] 1.50 0.2 0.175 0.100
# 2: versicolor (6,8] 4.60 1.4 0.300 0.200
# 3: versicolor (4,6] 4.05 1.3 0.525 0.275
# 4: virginica (6,8] 5.60 2.1 0.700 0.500
# 5: virginica (4,6] 5.00 1.9 0.200 0.200
Si desea que los nombres sean como Petal.Length.med
lugar de med.Petal.Length
, cambie el orden:
DT[, unlist(recursive=FALSE, lapply(
.SD,
function(x) lapply(.(med = median, iqr = IQR), function(f) f(x))
)), by=.(Species, Bin), .SDcols=Petal.Length:Petal.Width]
# Species Bin Petal.Length.med Petal.Length.iqr Petal.Width.med Petal.Width.iqr
# 1: setosa (4,6] 1.50 0.175 0.2 0.100
# 2: versicolor (6,8] 4.60 0.300 1.4 0.200
# 3: versicolor (4,6] 4.05 0.525 1.3 0.275
# 4: virginica (6,8] 5.60 0.700 2.1 0.500
# 5: virginica (4,6] 5.00 0.200 1.9 0.200