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

  1. contare le righe in un gruppo,

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

# 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

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


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow