data.table
Calcolo delle statistiche di riepilogo
Ricerca…
Osservazioni
Un promemoria: DT[where, select|update|do, by]
è usato per lavorare con le colonne di un data.table.
- La parte "dove" è l'argomento
i
- La parte "select | update | do" è l'argomento
j
Questi due argomenti vengono generalmente passati per posizione anziché per nome.
Conteggio delle righe per gruppo
# example data
DT = data.table(iris)
DT[, Bin := cut(Sepal.Length, c(4,6,8))]
Utilizzando .N
.N
in j
memorizza il numero di righe in un sottoinsieme. Durante l'esplorazione dei dati, .N
è utile per ...
contare le righe in un gruppo,
DT[Species == "setosa", .N] # 50
o contare le righe in tutti i gruppi,
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 trova gruppi che hanno un certo numero di righe.
DT[, .N, by=.(Species, Bin)][ N < 25 ] # Species Bin N # 1: versicolor (6,8] 20 # 2: virginica (4,6] 9
Gestione dei gruppi mancanti
Tuttavia, ci mancano gruppi con un conteggio pari a zero sopra. Se contano, possiamo usare la table
dalla 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
In alternativa, possiamo partecipare a tutti i gruppi:
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 su .N
:
- Questo esempio usa
.N
inj
, dove si riferisce alla dimensione di un sottoinsieme. - In
i
, si riferisce al numero totale di righe.
Riepiloghi personalizzati
# example data
DT = data.table(iris)
DT[, Bin := cut(Sepal.Length, c(4,6,8))]
Supponiamo di volere l'output della funzione di summary
per Sepal.Length
insieme al numero di osservazioni:
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
Dobbiamo fare j
un elenco di colonne. Di solito, alcuni giocano con c
, as.list
e .
è abbastanza per capire il modo corretto di procedere.
Assegnazione di statistiche di riepilogo come nuove colonne
Invece di creare una tabella di riepilogo, potremmo voler memorizzare una statistica riassuntiva in una nuova colonna. Possiamo usare :=
come al solito. Per esempio,
DT[, is_big := .N >= 25, by=.(Species, Bin)]
insidie
Dati disordinati
Se ti trovi a voler analizzare i nomi delle colonne, ad esempio
Prendi la media di
x.Length/x.Width
dovex
prende dieci valori diversi.
quindi probabilmente stai guardando i dati incorporati nei nomi delle colonne, che è una cattiva idea. Leggi informazioni in ordine e poi rimodella in formato lungo.
Riepiloghi a riga
I frame di dati e i dati.tables sono ben progettati per i dati tabulari, dove le righe corrispondono a osservazioni e colonne a variabili. Se ti ritrovi a voler riassumere le righe, ad esempio
Trova la deviazione standard tra le colonne per ogni riga.
allora dovresti probabilmente usare una matrice o qualche altro formato di dati interamente.
La funzione di riepilogo
# example data
DT = data.table(iris)
DT[, Bin := cut(Sepal.Length, c(4,6,8))]
summary
è utile per consultare le statistiche di riepilogo. Oltre all'utilizzo diretto come summary(DT)
, può anche essere applicato per gruppo comodamente con lo 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...]
Per includere i gruppi con conteggio zero, impostare drop=FALSE
in split
.
Applicazione di una funzione di riepilogo a più variabili
# example data
DT = data.table(iris)
DT[, Bin := cut(Sepal.Length, c(4,6,8))]
Per applicare la stessa funzione di riepilogo a ogni colonna per gruppo, possiamo usare lapply
e .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
Possiamo filtrare le colonne in .SD
con l'argomento .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
Molteplici funzioni di riepilogo
Attualmente, l'estensione più semplice a più funzioni è forse:
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
Se desideri che i nomi siano come Petal.Length.med
anziché med.Petal.Length
, modifica l'ordine:
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