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 ...

  1. contar filas en un grupo,

    DT[Species == "setosa", .N]
    
    # 50
    
  2. 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
    
  3. 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 en j , 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 donde x 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


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow