data.table
Computing samenvatting statistieken
Zoeken…
Opmerkingen
Een herinnering: DT[where, select|update|do, by]
syntaxis wordt gebruikt om te werken met kolommen van een data.table.
- Het "waar" gedeelte is het
i
argument - Het gedeelte "select | update | do" is het argument
j
Deze twee argumenten worden meestal op positie doorgegeven in plaats van op naam.
Rijen per groep tellen
# example data
DT = data.table(iris)
DT[, Bin := cut(Sepal.Length, c(4,6,8))]
.N
Gebruiken
.N
in j
slaat het aantal rijen in een subset op. Bij het verkennen van gegevens is .N
handig om ...
rijen tellen in een groep,
DT[Species == "setosa", .N] # 50
of rijen tellen in alle groepen,
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
of zoek groepen met een bepaald aantal rijen.
DT[, .N, by=.(Species, Bin)][ N < 25 ] # Species Bin N # 1: versicolor (6,8] 20 # 2: virginica (4,6] 9
Omgaan met ontbrekende groepen
We missen echter groepen met een telling van nul hierboven. Als ze ertoe doen, kunnen we de table
van base gebruiken:
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
Als alternatief kunnen we deelnemen aan alle groepen:
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
Een opmerking over .N
:
- Dit voorbeeld gebruikt
.N
inj
, waar het verwijst naar de grootte van een subset. - In
i
verwijst dit naar het totale aantal rijen.
Aangepaste samenvattingen
# example data
DT = data.table(iris)
DT[, Bin := cut(Sepal.Length, c(4,6,8))]
Stel dat we de summary
uitvoer voor Sepal.Length
samen met het aantal observaties:
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
We moeten j
een lijst met kolommen maken. Meestal spelen sommigen met c
, as.list
en .
is genoeg om de juiste manier om verder te gaan te achterhalen.
Overzichtsstatistieken toewijzen als nieuwe kolommen
In plaats van een samenvattende tabel te maken, willen we misschien een samenvattende statistiek in een nieuwe kolom opslaan. We kunnen gebruiken :=
zoals gewoonlijk. Bijvoorbeeld,
DT[, is_big := .N >= 25, by=.(Species, Bin)]
valkuilen
Onordelijke gegevens
Als u merkt dat u kolomnamen wilt parseren, zoals
Neem het gemiddelde van
x.Length/x.Width
waarbijx
tien verschillende waarden aanneemt.
dan kijkt u waarschijnlijk naar gegevens die zijn ingesloten in kolomnamen, wat een slecht idee is. Lees over opgeruimde gegevens en verander vervolgens in lang formaat.
Rowwise samenvattingen
Dataframes en data.tables zijn goed ontworpen voor tabelgegevens, waarbij rijen overeenkomen met waarnemingen en kolommen met variabelen. Als je merkt dat je over rijen wilt samenvatten, zoals
Zoek de standaarddeviatie over kolommen voor elke rij.
dan zou u waarschijnlijk een matrix of een ander gegevensformaat volledig moeten gebruiken.
De samenvatting functie
# example data
DT = data.table(iris)
DT[, Bin := cut(Sepal.Length, c(4,6,8))]
summary
is handig voor het bekijken van samenvattingstatistieken. Naast direct gebruik zoals summary(DT)
, kan het ook gemakkelijk per groep worden toegepast met 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...]
Om groepen met nul tellen op te nemen, stelt u drop=FALSE
in split
.
Een samenvattende functie toepassen op meerdere variabelen
# example data
DT = data.table(iris)
DT[, Bin := cut(Sepal.Length, c(4,6,8))]
Om dezelfde samenvattende functie op elke kolom per groep toe te passen, kunnen we lapply
en .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
We kunnen de kolommen in .SD
met het .SDcols
argument:
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
Meerdere samenvattende functies
Momenteel is de eenvoudigste uitbreiding van meerdere functies misschien:
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
Als u wilt dat de namen op Petal.Length.med
plaats van med.Petal.Length
, wijzigt u de volgorde:
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