2013-02-11 22 views
7

Oto mały powtarzalne przykładem moich danych:Obliczanie statystyk dotyczących podzbiorów danych

> 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 

Chciałbym wygenerować nową zmienną zawierającą średnio measure dla danego przedmiotu, tak:

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 

Czy istnieje prosty sposób na zrobienie tego, poza zapętleniem wszystkich rekordów programowo lub przekształceniem na szeroki format?

Odpowiedz

14

użyć funkcji baza R ave(), który pomimo swojej nazwy mylące, można obliczyć szereg statystyk, w tym 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 

Pamiętaj, że używam within tylko ze względu na krótszy kod. Oto odpowiednik bez 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' jest zbędne, prawda? To domyślna funkcja "FUN" –

6

Można użyć ddply z pakietu 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

Alternatywnie z data.table opakowania:

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 
Powiązane problemy