Đây là một ví dụ với chức năng aggregates()
tôi đã tự làm cách đây một thời gian:
# simulates data
set.seed(666)
( dat <- data.frame(group=gl(3,6), level=factor(rep(c("A","B","C"), 6)),
y=round(rnorm(18,10),1)) )
> dat
group level y
1 1 A 10.8
2 1 B 12.0
3 1 C 9.6
4 1 A 12.0
5 1 B 7.8
6 1 C 10.8
7 2 A 8.7
8 2 B 9.2
9 2 C 8.2
10 2 A 10.0
11 2 B 12.2
12 2 C 8.2
13 3 A 10.9
14 3 B 8.3
15 3 C 10.1
16 3 A 9.9
17 3 B 10.9
18 3 C 10.3
# aggregates() function
aggregates <- function(formula, data=NULL, FUNS){
if(class(FUNS)=="list"){
f <- function(x) sapply(FUNS, function(fun) fun(x))
}else{f <- FUNS}
temp <- aggregate(formula, data, f)
out <- data.frame(temp[,-ncol(temp)], temp[,ncol(temp)])
colnames(out)[1] <- colnames(temp)[1]
return(out)
}
# example
FUNS <- function(x) c(mean=round(mean(x),0), sd=round(sd(x), 0))
( ag <- aggregates(y~group:level, data=dat, FUNS=FUNS) )
Nó cho kết quả như sau:
> ag
group level mean sd
1 1 A 11 1
2 2 A 9 1
3 3 A 10 1
4 1 B 10 3
5 2 B 11 2
6 3 B 10 2
7 1 C 10 1
8 2 C 8 0
9 3 C 10 0
Có lẽ bạn có thể nhận được kết quả tương tự bắt đầu từ hàm R split ():
> with(dat, sapply( split(y, group:level), FUNS ) )
1:A 1:B 1:C 2:A 2:B 2:C 3:A 3:B 3:C
mean 11 10 10 9 11 8 10 10 10
sd 1 3 1 1 2 0 1 2 0
Hãy để tôi trở lại đầu ra của aggregates
hàm. Bạn có thể biến nó trong một bảng đẹp sử dụng reshape()
, xtabs()
và ftable()
:
rag <- reshape(ag, varying=list(3:4), direction="long", v.names="y")
rag$time <- factor(rag$time)
ft <- ftable(xtabs(y~group+level+time, data=rag))
attributes(ft)$col.vars <- list(c("mean","sd"))
Điều này mang lại:
> ft
mean sd
group level
1 A 11 1
B 10 3
C 10 1
2 A 9 1
B 11 2
C 8 0
3 A 10 1
B 10 2
C 10 0
Đẹp phải không? Bạn có thể xuất bảng này sang pdf với textplot()
chức năng củagplots
gói.
Xem ở đây để biết giải pháp của người khác.