data.table
Beräkningsöversiktstatistik
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 ...
räkna rader i en grupp,
DT[Species == "setosa", .N] # 50
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
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
ij
, 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ärx
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