R: Berechnen Sie die Mittelwerte für die Teilmenge einer Gruppe
-
27-10-2019 - |
Frage
Ich möchte den Mittelwert für jeden "Tag" berechnen, aber für einen Teil des Tages (Zeit = 12-14). Dieser Code funktioniert für mich, aber ich muss jeden Tag als neue Codezeile eingeben, die Hunderte von Zeilen ausmacht.
Dies scheint einfach zu tun sein. Ich habe dies leicht gemacht, wenn die Gruppierungsvariablen gleich sind, aber nicht wissen, wie es geht, wenn ich nicht alle Werte für den Tag einbeziehen möchte. Gibt es einen besseren Weg, dies zu tun?
sapply(sap[sap$Day==165 & sap$Time %in% c(12,12.1,12.2,12.3,12.4,12.5,13,13.1,13.2,13.3,13.4,13.5, 14), ],mean)
sapply(sap[sap$Day==166 & sap$Time %in% c(12,12.1,12.2,12.3,12.4,12.5,13,13.1,13.2,13.3,13.4,13.5, 14), ],mean)
So sieht die Daten aus:
Day Time StomCond_Trunc
165 12 33.57189926
165 12.1 50.29437636
165 12.2 35.59876214
165 12.3 24.39879768
Lösung
Versuche dies:
aggregate(StomCond_Trunc~Day,data=subset(sap,Time>=12 & Time<=14),mean)
Andere Tipps
Wenn Sie einen großen Datensatz haben, möchten Sie möglicherweise auch das untersuchen data.table
Paket. Konvertieren a data.frame
zu einem data.table
ist ziemlich einfach.
Beispiel:
Großer Datensatz (ISH)
df <- data.frame(Day=1:1000000,Time=sample(1:14,1000000,replace=T),StomCond_Trunc=rnorm(100000)*20)
Verwenden von Aggregat auf der data.frame
>system.time(aggregate(StomCond_Trunc~Day,data=subset(df,Time>=12 & Time<=14),mean))
user system elapsed
16.255 0.377 24.263
Konvertieren in a data.table
dt <- data.table(df,key="Time")
>system.time(dt[Time>=12 & Time<=14,mean(StomCond_Trunc),by=Day])
user system elapsed
9.534 0.178 15.270
Update von Matthew. Dieses Timing hat sich seit der ursprünglichen Beantwortung einer neuen Optimierungsfunktion in Daten dramatisch verbessert. Table 1.8.2.
Wiederholung der Differenz zwischen den beiden Ansätzen unter Verwendung von Daten.Tabell 1,8.2 in R 2.15.1:
df <- data.frame(Day=1:1000000,
Time=sample(1:14,1000000,replace=T),
StomCond_Trunc=rnorm(100000)*20)
system.time(aggregate(StomCond_Trunc~Day,data=subset(df,Time>=12 & Time<=14),mean))
# user system elapsed
# 10.19 0.27 10.47
dt <- data.table(df,key="Time")
system.time(dt[Time>=12 & Time<=14,mean(StomCond_Trunc),by=Day])
# user system elapsed
# 0.31 0.00 0.31
Verwenden Sie Ihre ursprüngliche Methode, jedoch mit weniger Eingabe:
sapply(sap[sap$Day==165 & sap$Time %in% seq(12, 14, 0.1), ],mean)
Dies ist jedoch nur eine etwas bessere Methode als Ihre ursprüngliche. Es ist nicht so flexibel wie die anderen Antworten, da es von 0,1 Schritten in Ihren Zeitwerten abhängt. Die anderen Methoden kümmern sich nicht um die Inkrementgröße, was sie vielseitiger macht. Ich würde @Maiasauras Antwort mit empfehlen mit data.table