R: Calcola i mezzi per il sottoinsieme di un gruppo
-
27-10-2019 - |
Domanda
Voglio calcolare la media per ogni "giorno" ma per una parte del giorno (tempo = 12-14). Questo codice funziona per me ma devo inserire ogni giorno come una nuova riga di codice, che ammonta a centinaia di righe.
Sembra che dovrebbe essere semplice da fare. L'ho fatto facilmente quando le variabili di raggruppamento sono uguali ma non so come farlo quando non voglio includere tutti i valori per la giornata. C'è un modo migliore per farlo?
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)
Ecco come sono i dati:
Day Time StomCond_Trunc
165 12 33.57189926
165 12.1 50.29437636
165 12.2 35.59876214
165 12.3 24.39879768
Soluzione
Prova questo:
aggregate(StomCond_Trunc~Day,data=subset(sap,Time>=12 & Time<=14),mean)
Altri suggerimenti
Se hai un set di dati di grandi dimensioni, potresti anche voler esaminare il data.table
pacchetto. Convertire a data.frame
a a data.table
è abbastanza facile.
Esempio:
Set di dati di grandi dimensioni (ish)
df <- data.frame(Day=1:1000000,Time=sample(1:14,1000000,replace=T),StomCond_Trunc=rnorm(100000)*20)
Usando aggregati sul file 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
Convertendolo 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
Aggiornamento da Matthew. Questo tempismo è migliorato drasticamente da quando ha risposto originariamente a causa di una nuova funzionalità di ottimizzazione nei dati. Tabella 1.8.2.
Testendo la differenza tra i due approcci, utilizzando Data.Table 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
Using your original method, but with less typing:
sapply(sap[sap$Day==165 & sap$Time %in% seq(12, 14, 0.1), ],mean)
However this is only a slightly better method than your original one. It's not as flexible as the other answers since it depends on 0.1 increments in your time values. The other methods don't care about the increment size, which makes them more versatile. I'd recommend @Maiasaura's answer with data.table