среднее значение и стандартное отклонение по группе для нескольких переменных

Я уверен, что на этот вопрос уже был дан ответ, но я хотел бы вычислить среднее значение и sd путем обработки нескольких переменных (100) одновременно и не могу понять, как это сделать, кроме использования длинного кода ddply.

Это часть моего фрейма данных (g):

   trt blk til res sand silt clay ibd1_6 ibd9_14 ibd_ave
1  CTK   1  CT   K   74   15   11  1.323   1.593   1.458
2  CTK   2  CT   K   71   15   14  1.575   1.601   1.588
3  CTK   3  CT   K   72   14   14  1.551   1.594   1.573
4  CTR   1  CT   R   72   15   13  1.560   1.647   1.604
5  CTR   2  CT   R   73   14   13  1.612   1.580   1.596
6  CTR   3  CT   R   73   13   14  1.709   1.577   1.643
7  ZTK   1  ZT   K   72   16   12  1.526   1.546   1.536
8  ZTK   2  ZT   K   71   16   13  1.292   1.626   1.459
9  ZTK   3  ZT   K   71   17   12  1.623   1.607   1.615
10 ZTR   1  ZT   R   66   16   18  1.719   1.709   1.714
11 ZTR   2  ZT   R   67   17   16  1.529   1.708   1.618
12 ZTR   3  ZT   R   66   17   17  1.663   1.655   1.659 

Я хотел бы иметь функцию, которая делает то же, что и ddply, то есть ddply(g, trt, meanSand=mean(sand), sdSand=sd(sand), meanSilt=mean(silt) . . .) без необходимости писать ее все вон. Любые идеи? Спасибо за ваше терпение!


person user2296772    schedule 18.04.2013    source источник


Ответы (3)


Функция, которую вы, вероятно, захотите применить к своему фрейму данных, — это aggregate() с mean или sd в качестве параметра функции.

person Simon    schedule 18.04.2013
comment
Спасибо всем! Я новичок на этом сайте и рад видеть терпение более опытных пользователей. - person user2296772; 21.04.2013

предполагая, что myDF является вашим исходным набором данных:

library(data.table)
myDT <- data.table(myDF)

# Which variables to calculate  All columns but the first five? : 
variables <- tail( names(myDT), -5)

myDT[, lapply(.SD, function(x) list(mean(x), sd(x))), .SDcols=variables, by=list(trt, til)]


## OR Separately, if you prefer shorter `lapply` statements
myDT[, lapply(.SD, mean), .SDcols=variables, by=list(trt, til)]
myDT[, lapply(.SD, sd),   .SDcols=variables, by=list(trt, til)]

--

> myDT[, lapply(.SD, mean), .SDcols=variables, by=list(trt, til)]
#    trt til     silt     clay   ibd1_6  ibd9_14  ibd_ave
# 1: CTK  CT 14.66667 13.00000 1.483000 1.596000 1.539667
# 2: CTR  CT 14.00000 13.33333 1.627000 1.601333 1.614333
# 3: ZTK  ZT 16.33333 12.33333 1.480333 1.593000 1.536667
# 4: ZTR  ZT 16.66667 17.00000 1.637000 1.690667 1.663667

> myDT[, lapply(.SD, sd), .SDcols=variables, by=list(trt, til)]
#    trt til      silt      clay     ibd1_6     ibd9_14    ibd_ave
# 1: CTK  CT 0.5773503 1.7320508 0.13908271 0.004358899 0.07112196
# 2: CTR  CT 1.0000000 0.5773503 0.07562407 0.039576929 0.02514624
# 3: ZTK  ZT 0.5773503 0.5773503 0.17015973 0.041797129 0.07800214
# 4: ZTR  ZT 0.5773503 1.0000000 0.09763196 0.030892286 0.04816984
person Ricardo Saporta    schedule 18.04.2013

aggregate(g[, c("sand", "silt", "clay")],  g$trt, function(x) c(mean=mean(x), sd=sd(x) ) )

Использование анонимной функции с aggregate.data.frame позволяет получить оба значения одним вызовом. Вы хотите передать только столбцы для агрегирования. Если у вас был длинный список столбцов и вы хотели исключить, скажем, первые 4 из вычислений, это можно было бы записать как:

aggregate(g[, names(g)[-(1:4)],  g$trt, function(x) c(mean=mean(x), sd=sd(x) ) )
person IRTFM    schedule 18.04.2013