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
War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top