Ich habe eine data.table namens enc.per.day für Begegnungen pro Tag. Es hat 2403 Zeilen, in denen ein Datum des Dienstes angegeben ist und die Anzahl der an diesem Tag gesehenen Patienten. Ich wollte die mediane Anzahl der Patienten an jedem Wochentag sehen.Warum steigt die mittlere Datenrate der Data.table (Integer gegenüber Double)?
enc.per.day[,list(patient.encounters=median(n)),by=list(weekdays(DOS))]
Diese Linie gibt einen Fehler
Fehler in
[.data.table
(enc.per.day, Liste (patient.encounters = Median (n)),: Spalten von j auswerten nicht konsequentem Typen für jede Gruppe: Ergebnis für die Gruppe hat 4 Spalte 1 Typ ‚ganze Zahl‘, aber erwartete Typ ‚doppelte‘
Die folgende Alle Arbeiten gut
tapply(enc.per.day$n,weekdays(enc.per.day$DOS),median)
enc.per.day[,list(patient.encounters=round(median(n))),by=list(weekdays(DOS))]
enc.per.day[,list(patient.encounters=median(n)+0),by=list(weekdays(DOS))]
Was ist los? Es hat lange gedauert, bis ich herausgefunden habe, warum mein Code nicht funktioniert.
durch die Art der zugrunde liegenden Vektor enc.per.day $ n eine ganze Zahl
storage.mode(enc.per.day$n)
returns "integer". Außerdem befinden sich in der data.table keine NAs.
@Matthew Dowle - Vielen Dank für diese Informationen darüber, wie das Hinzufügen * * data.table ** initialisiert und reserviert Speicherplatz für den Ergebnisvektor. –
Ist es möglich, einen Median des gleichen Typs wie den Wert zu haben? Selbst wenn ich also Werte wie = 1,1,1,2,2,2,2 hätte, sollte es nicht zu einem Median = 1,5 führen, stattdessen sollte der Median = 2 sein. – lony
Als Beispiel für den obigen Vorschlag, tun Sie dies DT [, c (as.double (lapply (. SD, Median)),. N), durch = x,. SDcols = c ("x", "y “, "Z")] anstelle von DT [, C (lapply (.SD, Median), .N), by = x, .SDcols = c ("x", "y", "z")] –