다음은 aggregates()
내가 전에 한 일 을 한 함수의 예입니다 .
# 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) )
결과는 다음과 같습니다.
> 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
어쩌면 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
aggregates
함수 의 출력으로 돌아 갑시다 . 당신은 사용하여 아름다운 테이블을 변환 할 수 있습니다 reshape()
, xtabs()
그리고 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"))
이것은 다음을 제공합니다.
> 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
아름답 지 않습니까? 패키지 textplot()
기능을 사용하여이 테이블을 pdf로 내보낼 수 있습니다 gplots
.
다른 사람의 솔루션 은 여기 를 참조 하십시오 .