/ / Median meldet einen Fehler bei der Verwendung von data.table in R - r, data.table

Median gibt einen Fehler zurück, wenn data.table in R - r, data.table verwendet wird

Ich habe den folgenden Datensatz

> head(DT)
V1 V2 V3   V4   V5     V6 V7
1:  2  1  2 0.91 0.02 880.00  1
2:  3  2  1 0.02 0.00   2.24  2
3:  1  1  1 0.15 0.01   3.41  3
4:  1  2  1 3.92 0.05 268.67  2
5:  1  1  2 0.10 0.01   1.59  3
6:  0  1  1 1.20 0.04   1.43  3

> sapply(DT, class)
V1        V2        V3        V4        V5        V6        V7
"integer" "integer" "integer" "numeric" "numeric" "numeric"  "factor"

das erweitert sich für Tausende von Reihen. Ich versuche die Medianwerte von V1-V6 innerhalb der 8 durch den Faktor Variable V7 definierten Gruppen zu berechnen

> levels(DT$V7)
[1] "1" "2" "3" "4" "5" "6" "7" "8"

Im Moment verwende ich den folgenden Befehl, der einen Fehler zurückgibt:

> DT[, lapply(.SD, median), by = V7]
Error in `[.data.table`(DF, , lapply(.SD, median), by = V7) :
Column 1 of result for group 4 is type "integer" but expecting type "double". Column types must be consistent for each group.

Ich habe irgendwo gelesen, dass dies eine Möglichkeit ist as.double(median(X)). Dies funktioniert aber für einzelne Spalten: DT[, as.double(median(X)), by = V7], aber nicht für alle Spalten: DT[, lapply(.SD, as.double(median)), by = V7] (wie erwartet, weil Sie eine Eingabe an den Median übergeben müssen)

Ich kann mit Aggregat umgehen

> aggregate(DT[,c(1:6), with = FALSE], by = list(DF$V7), FUN = median)
Group.1 V1 V2 V3     V4   V5      V6
1       1  0  1  1  1.285 0.04 401.500
2       2  1  2  1  3.565 0.06   6.400
3       3  0  1  1  0.360 0.03  11.200
4       4  1  1  1 74.290 0.26 325.960
5       5  2  1  0  1.145 0.04   1.415
6       6  0  1  1 10.100 0.18  93.000
7       7  1  1  0  0.740 0.04   1.080
8       8  1  1  0  7.970 0.40   0.050

Ich möchte aber gerne wissen, ob es einen Weg gibt, den oben beschriebenen Fehler zu lösen und diese Berechnung mit data.table durchzuführen

Antworten:

12 für die Antwort № 1

median ist ungewöhnlich, da verschiedene Typen von Rückgabewerten für denselben Eingabetyp zurückgegeben werden können:

Die Standardmethode gibt ein length-one-Objekt des gleichen Typs wie x zurück. außer wenn x eine ganze Zahl mit gerader Länge ist, wenn das Ergebnis sein wird doppelt.

Data.table benötigt jedoch einen konsistenten Rückgabewerttyp. Sie haben zwei Möglichkeiten:

Alle Spalten in numerische konvertieren:

DT[, paste0("V", 1:6) := lapply(.SD, as.numeric), by = V7]

Oder konvertieren Sie den Rückgabewert von median:

DT[, lapply(.SD, function(x) as.numeric(median(x))), by = V7]