R: Quais são as melhores funções para lidar com os valores concatenadores e médios em um dados.frame?

StackOverflow https://stackoverflow.com/questions/2473659

Pergunta

Eu tenho um data.frame deste código:

   my_df = data.frame("read_time" = c("2010-02-15", "2010-02-15", 
                                      "2010-02-16", "2010-02-16", 
                                       "2010-02-16", "2010-02-17"), 
                      "OD" = c(0.1, 0.2, 0.1, 0.2, 0.4, 0.5) )

que produz isso:

> my_df
   read_time  OD
1 2010-02-15 0.1
2 2010-02-15 0.2
3 2010-02-16 0.1
4 2010-02-16 0.2
5 2010-02-16 0.4
6 2010-02-17 0.5

Quero calcular a média da coluna OD sobre cada distinto read_time (observe que alguns são replicados que outros não são) e também gostaria de calcular o desvio padrão, produzindo uma tabela como esta:

> my_df
   read_time  OD        stdev
1 2010-02-15 0.15       0.05
5 2010-02-16 0.3         0.1
6 2010-02-17 0.5         0

Quais são as melhores funções para lidar com a concatenação de tais valores em um Data.frame?

Foi útil?

Solução

o Plyr O pacote é popular para isso, mas as funções básicas by() e aggregate() também ajudará.

> ddply(my_df, "read_time", function(X) data.frame(OD=mean(X$OD),stdev=sd(X$OD)))
   read_time      OD   stdev
1 2010-02-15 0.15000 0.07071
2 2010-02-16 0.23333 0.15275
3 2010-02-17 0.50000      NA

Você pode adicionar o bit ausente para retornar 0 em vez de NA para o último std.dev.

Além disso, você não precisa das cotações (nas variáveis) que você teve na construção de dados.

Outras dicas

Você pode experimentar os dados do pacote.table. Se você conhece o MySQL, deve ser muito fácil para você obter todas as funções, caso contrário, o básico também é bom o suficiente ;-)

my_dfdt<-data.table(my_df)
mean<-my_dfdt[,mean(OD), by="read_time"]
sd<-  ..  

Você também pode se juntar a ambos em uma linha ou para cbind no final, sua chamada de estilo

Outra vantagem: é extremamente rápido, se você tiver amostras grandes. Muito rápido ... veja a documentação por quê.

Isso ilustra como você pode usar aggregate para obter a média e o desvio padrão pelo seu read_time.

>aggregate(my_df$OD, by=list(my_df$read_time), function(x) mean(x))

     Group.1         x
1 2010-02-15 0.1500000
2 2010-02-16 0.2333333
3 2010-02-17 0.5000000


>aggregate(my_df$OD, by=list(my_df$read_time), function(x) sd(x))
     Group.1          x
1 2010-02-15 0.07071068
2 2010-02-16 0.15275252
3 2010-02-17         NA
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top