R 語言的分組統計
分組計算描述性統計量
1.使用aggregate()分組獲取描述性統計量。
aggregate(data,by=list(v1,v2),mean)這裡的分組是用list()來區分。但這個有弊端,只能是單返回值函式。像mean,sd.
2.使用by() 分組計算描述性統計量。(不知道怎麼都執行報錯!!)
語法 by(data,indices,fun)其中data是一個數據框或矩陣。這裡fun可以是多返回值函式。
data是一個數據框,indices 是一個因子或因子組成的列表。fun 可以是自己定義的函式。
例:
dstats<-function(x)(c(mean=mean(x),sd=sd(x)))
by(mtcars[vars],mtcars$am,dstats)
3.使用doBy包中的summaryBy() 分組計算概述統計量。
library(doBy)
summaryBy(mpg+hp+wt~am,data=mtcars,FUN=mystats) 其中FUN為自定義的函式。
> summaryBy(mpg+hp~am,data=mtcars,FUN=fun1)
am mpg.mean mpg.sd hp.mean hp.sd
1 0 17 3.8 160 54
2 1 24 6.2 127 84
4.reshape包中的函式。melt ,cast
dstats<-function(x)(c(n=length(x),mean=mean(x),sd=sd(x)))
dfm<-melt(mtcars,measure.vars = c("mpg","hp","wt"),id.vars=c("am","cyl"))
dcast(sfm, am+ cyl+ variable ~ .,dstats)
Error in dim(ordered) <- ns :
dims [product 18] do not match the length of object [54]
主要原因是:dcast() 裡面的函式必須是返回單一值的函式,此處定義的是多個值的,因此報錯,如果改成單個函式。
> dcast(sfm, am+ cyl+ variable ~ .,mean)
am cyl variable .
1 0 4 mpg 22.900000
2 0 4 hp 84.666667
3 0 4 wt 2.935000
4 0 6 mpg 19.125000
5 0 6 hp 115.250000
6 0 6 wt 3.388750
7 0 8 mpg 15.050000
8 0 8 hp 194.166667
9 0 8 wt 4.104083
10 1 4 mpg 28.075000
11 1 4 hp 81.875000
12 1 4 wt 2.042250
13 1 6 mpg 20.566667
14 1 6 hp 131.666667
15 1 6 wt 2.755000
16 1 8 mpg 15.400000
17 1 8 hp 299.500000
18 1 8 wt 3.370000