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
È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top