data.table
Usando .SD y .SDcols para el subconjunto de datos
Buscar..
Introducción
.SD
está disponible en j
de DT[i,j,by]
, la captura de la S ubset de ata D para cada by
grupo sobrevivir el filtro, i
. .SDcols
es un ayudante. Escriba ?`special-symbols`
para los documentos oficiales.
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.
Usando .SD y .SDcols
.DAKOTA DEL SUR
.SD
refiere al subconjunto de la data.table
de data.table
para cada grupo, excluyendo todas las columnas utilizadas by
.
.SD
junto con lapply
se puede usar para aplicar cualquier función a varias columnas por grupo en una data.table
Continuaremos usando el mismo conjunto de datos mtcars
, mtcars
:
mtcars = data.table(mtcars) # Let's not include rownames to keep things simpler
Media de todas las columnas en el conjunto de datos por número de cilindros , cyl
:
mtcars[ , lapply(.SD, mean), by = cyl]
# cyl mpg disp hp drat wt qsec vs am gear carb
#1: 6 19.74286 183.3143 122.28571 3.585714 3.117143 17.97714 0.5714286 0.4285714 3.857143 3.428571
#2: 4 26.66364 105.1364 82.63636 4.070909 2.285727 19.13727 0.9090909 0.7272727 4.090909 1.545455
#3: 8 15.10000 353.1000 209.21429 3.229286 3.999214 16.77214 0.0000000 0.1428571 3.285714 3.500000
Aparte de cyl
, hay otras columnas categóricas en el conjunto de datos como vs
, am
, gear
y carb
. Realmente no tiene sentido tomar la mean
de estas columnas. Así que vamos a excluir estas columnas. Aquí es donde .SDcols
entra en escena.
.SDcols
.SDcols
especifica las columnas de la data.table
que se incluyen en .SD
.
La media de todas las columnas (columnas continuas) en el conjunto de datos por número de engranajes gear
, y el número de cilindros, cyl
, dispuestos por gear
y cyl
:
# All the continuous variables in the dataset
cols_chosen <- c("mpg", "disp", "hp", "drat", "wt", "qsec")
mtcars[order(gear, cyl), lapply(.SD, mean), by = .(gear, cyl), .SDcols = cols_chosen]
# gear cyl mpg disp hp drat wt qsec
#1: 3 4 21.500 120.1000 97.0000 3.700000 2.465000 20.0100
#2: 3 6 19.750 241.5000 107.5000 2.920000 3.337500 19.8300
#3: 3 8 15.050 357.6167 194.1667 3.120833 4.104083 17.1425
#4: 4 4 26.925 102.6250 76.0000 4.110000 2.378125 19.6125
#5: 4 6 19.750 163.8000 116.5000 3.910000 3.093750 17.6700
#6: 5 4 28.200 107.7000 102.0000 4.100000 1.826500 16.8000
#7: 5 6 19.700 145.0000 175.0000 3.620000 2.770000 15.5000
#8: 5 8 15.400 326.0000 299.5000 3.880000 3.370000 14.5500
Tal vez no queremos calcular la mean
por grupos. Para calcular la media de todos los autos en el conjunto de datos, no especificamos la variable by
.
mtcars[ , lapply(.SD, mean), .SDcols = cols_chosen]
# mpg disp hp drat wt qsec
#1: 20.09062 230.7219 146.6875 3.596563 3.21725 17.84875
Nota: No es necesario definir cols_chosen
antemano. .SDcols
puede tomar directamente nombres de columna