2013-07-15 2 views
5

집계가 행렬의 일부가 아닌 별도의 열로 저장되는 방식으로 더 많은 함수를 사용하여 aggregate()을 사용할 수 있습니까? 열 Group.1, cyl.1, cyl.2이 아닌 Group.1, cyl이 아닌 데이터 프레임을 갖고 싶습니다.더 많은 함수가있는 Aggregate() -

# Only one function 
> aggdata <-aggregate(mtcars["cyl"], by=list(vs), FUN=mean, na.rm=TRUE) 
> aggdata 
    Group.1  cyl 
1  0 7.444444 
2  1 4.571429 
> str(aggdata) 
'data.frame': 2 obs. of 2 variables: 
$ Group.1: num 0 1 
$ cyl : num 7.44 4.57 
> 
# Two functions 
> aggdata <-aggregate(mtcars["cyl"], by=list(cyl), FUN=function(x) c(length(x),mean(x))) 
> aggdata 
    Group.1 cyl.1 cyl.2 
1  4 11  4 
2  6  7  6 
3  8 14  8 
> str(aggdata) 
'data.frame': 3 obs. of 2 variables: 
$ Group.1: num 4 6 8 
$ cyl : num [1:3, 1:2] 11 7 14 4 6 8 
> aggdata$cyl 
    [,1] [,2] 
[1,] 11 4 
[2,] 7 6 
[3,] 14 8 

답변

8

do.call(data.frame, ...)에 랩 :

aggdata <-aggregate(mtcars["cyl"], by=list(mtcars$cyl), 
        FUN=function(x) c(length(x),mean(x))) 
do.call(data.frame, aggdata) 
# Group.1 cyl.1 cyl.2 
# 1  4 11  4 
# 2  6  7  6 
# 3  8 14  8 
str(do.call(data.frame, aggdata)) 
# 'data.frame': 3 obs. of 3 variables: 
# $ Group.1: num 4 6 8 
# $ cyl.1 : num 11 7 14 
# $ cyl.2 : num 4 6 8 

약간의 검색 후, 난 그냥 the source of my answer를 발견했다. 이것과 비슷한 몇 가지 다른 질문이 있지만, 이것은 내가 do.call(data.frame, ...) 접근법을 배웠던 곳이었습니다.

6

가 여기에 다른 생각 (... 내가 한 자신을 삭제 된 @ 제임스가 같은 대답을 추가 한 후 검색 무엇을 마음에 와서) - 스위치 data.table 대신 :

library(data.table) 
dt = data.table(mtcars) 

dt[, list(.N, mean(cyl)), by = cyl] 
# cyl N V2 
#1: 6 7 6 
#2: 4 11 4 
#3: 8 14 8 
# note, data.table is smart enough not to copy cyl needlessly 
# when you're grouping by it, so if you attempt to get length(cyl), you'll get 1 
# since cyl is just a number in each 'by' group 

str(dt[, list(.N, mean(cyl)), by = cyl]) 
#Classes ‘data.table’ and 'data.frame': 3 obs. of 3 variables: 
# $ cyl: num 6 4 8 
# $ N : int 7 11 14 
# $ V2 : num 6 4 8 
# - attr(*, ".internal.selfref")=<externalptr> 
+0

+1. 나는이 옵션을 공유하는 것에 대해 생각했다. 구문이 훨씬 더 좋았 기 때문에 생각했지만, 전에 만났던 '집계'출력의 처리 방법에 관한 실제 질문을 다루지는 않았다. 다루기가 다소 어색했다. . – A5C1D2H2I1M1N2O1R2T1

+0

@AnandaMahto 나는 그것이 질문에 대답하지 않는다는 것에 동의한다. (그리고 당신의 질문이 너의 대답이된다.)하지만 나는 기본적으로 OP가 잘못된 질문을하고 있다고 생각한다. :) – eddi

+1

나는 [내 소스 대답] (http://stackoverflow.com/a/14759569/1270695). 이것과 비슷한 몇 가지 다른 질문이 있지만 이것이'do.call (data.frame, ...) '접근법을 배웠던 곳입니다. – A5C1D2H2I1M1N2O1R2T1

관련 문제