Calculando statistics em subconjuntos de dados

Aqui está um pequeno exemplo reproduzível dos meus dados:

> mydata  mydata subject time measure 1 0 10 1 1 12 1 2 8 2 0 7 2 1 0 2 2 0 

Eu gostaria de gerar uma nova variável contendo o meio de measure para esse assunto em particular, então:

 subject time measure mn_measure 1 0 10 10 1 1 12 10 1 2 8 10 2 0 7 2.333 2 1 0 2.333 2 2 0 2.333 

Existe uma maneira fácil de fazer isso, além de fazer um loop através de todos os registros programaticamente ou reformular para o formato amplo primeiro?

   

Use a function R de base ave() , que, apesar de seu nome confuso, pode calcular uma variedade de statistics, incluindo a mean :

 within(mydata, mean< -ave(measure, subject, FUN=mean)) subject time measure mean 1 1 0 10 10.000000 2 1 1 12 10.000000 3 1 2 8 10.000000 4 2 0 7 2.333333 5 2 1 0 2.333333 6 2 2 0 2.333333 

Note que eu uso within apenas por uma questão de código mais curto. Aqui está o equivalente sem within() :

 mydata$mean < - ave(mydata$measure, mydata$subject, FUN=mean) mydata subject time measure mean 1 1 0 10 10.000000 2 1 1 12 10.000000 3 1 2 8 10.000000 4 2 0 7 2.333333 5 2 1 0 2.333333 6 2 2 0 2.333333 

Como alternativa, com o pacote data.table :

 require(data.table) dt < - data.table(mydata, key = "subject") dt[, mn_measure := mean(measure), by = subject] # subject time measure mn_measure # 1: 1 0 10 10.000000 # 2: 1 1 12 10.000000 # 3: 1 2 8 10.000000 # 4: 2 0 7 2.333333 # 5: 2 1 0 2.333333 # 6: 2 2 0 2.333333 

Você pode usar o plyr pacote plyr :

 library(plyr) res = ddply(mydata, .(subject), mutate, mn_measure = mean(measure)) res subject time measure mn_measure 1 1 0 10 10.000000 2 1 1 12 10.000000 3 1 2 8 10.000000 4 2 0 7 2.333333 5 2 1 0 2.333333 6 2 2 0 2.333333