R: Quais são as melhores funções para lidar com os valores concatenadores e médios em um dados.frame?
-
20-09-2019 - |
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?
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