2013-02-11 2 views
7

Вот небольшой воспроизводимый пример моих данных:Вычисление статистики по подмножеств данных

> mydata <- structure(list(subject = c(1, 1, 1, 2, 2, 2), time = c(0, 1, 2, 0, 1, 2), measure = c(10, 12, 8, 7, 0, 0)), .Names = c("subject", "time", "measure"), row.names = c(NA, -6L), class = "data.frame") 

> mydata 

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

Я хотел бы, чтобы сгенерировать новую переменную, содержащую среднее measure для этой конкретной теме, так:

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 

Есть ли простой способ сделать это, кроме как прокручивать все записи программно или переформатировать в широкоформатный формат в первую очередь?

ответ

14

Используйте функцию базового R ave(), которая, несмотря на запутанную имя, можно вычислить различные статистические данные, в том числе 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 

Обратите внимание, что я использую within только ради более короткого кода. Вот эквивалент без 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 
+0

'FUN = mean' является ненужным, верно? Это значение 'FUN' по умолчанию –

6

Вы можете использовать ddply из 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 
9

В качестве альтернативы с 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 
Смежные вопросы