Sök…


Anmärkningar

En påminnelse: DT[where, select|update|do, by] syntax används för att arbeta med kolumner i en datatabell.

  • "Var" -delen är i argumentet
  • Delen "select | update | do" är j argumentet

Dessa två argument skickas vanligtvis efter position istället för med namn.

Räknar rader per grupp

# example data
DT = data.table(iris)
DT[, Bin := cut(Sepal.Length, c(4,6,8))]

Använda .N

.N i j lagrar antalet rader i en delmängd. När du utforskar data är .N praktiskt att ...

  1. räkna rader i en grupp,

    DT[Species == "setosa", .N]
    
    # 50
    
  2. eller räkna rader i alla grupper,

    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. eller hitta grupper som har ett visst antal rader.

    DT[, .N, by=.(Species, Bin)][ N < 25 ]
    
    #       Species   Bin  N
    # 1: versicolor (6,8] 20
    # 2:  virginica (4,6]  9
    

Hantera saknade grupper

Vi saknar emellertid grupper med en räkning av noll ovan. Om de spelar någon roll kan vi använda table från basen:

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

Alternativt kan vi gå med i alla grupper:

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

En anteckning om .N :

  • Detta exempel använder .N i j , där det avser storlek på en delmängd.
  • I i hänvisar det till det totala antalet rader.

Anpassade sammanfattningar

# example data
DT = data.table(iris)
DT[, Bin := cut(Sepal.Length, c(4,6,8))]

Anta att vi vill ha summary för Sepal.Length tillsammans med antalet observationer:

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

Vi måste göra j en lista med kolumner. Vanligtvis spelar vissa med c , as.list och . räcker för att räkna ut rätt sätt att fortsätta.

Tilldela sammanfattande statistik som nya kolumner

Istället för att göra en sammanfattningstabell, kanske vi vill lagra en sammanfattande statistik i en ny kolumn. Vi kan använda := som vanligt. Till exempel,

DT[, is_big := .N >= 25, by=.(Species, Bin)]

Fallgropar gropar~~POS=HEADCOMP

Smutsiga data

Om du tycker att du vill analysera kolumnnamn, som

Ta medelvärdet av x.Length/x.Width x x.Length/x.Width där x tar tio olika värden.

då tittar du förmodligen på data inbäddade i kolumnnamn, vilket är en dålig idé. Läs om snygga data och omforma sedan till långt format.

Rowwise sammanfattningar

Dataramar och data.tabeller är väl utformade för tabelldata, där rader motsvarar observationer och kolumner till variabler. Om du hittar dig själv som vill sammanfatta över rader, som

Hitta standardavvikelsen mellan kolumner för varje rad.

då bör du antagligen använda en matris eller något annat dataformat helt.

Sammanfattningsfunktionen

# example data
DT = data.table(iris)
DT[, Bin := cut(Sepal.Length, c(4,6,8))]

summary är praktiskt för att bläddra i sammanfattningsstatistik. Förutom direkt användning som summary(DT) kan den också tillämpas per grupp bekvämt med 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...]

För att inkludera noll-räknegrupper anger du drop=FALSE i split .

Tillämpa en sammanfattande funktion på flera variabler

# example data
DT = data.table(iris)
DT[, Bin := cut(Sepal.Length, c(4,6,8))]

För att tillämpa samma sammanfattande funktion på varje kolumn för grupp kan vi använda lapply och .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

Vi kan filtrera kolumnerna i .SD med argumentet .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

Flera sammanfattande funktioner

För närvarande är det enklaste tillägget till flera funktioner kanske:

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

Om du vill att namnen ska vara som Petal.Length.med istället för med.Petal.Length , ändra ordningen:

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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow