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

  1. rijen tellen in een groep,

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


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow