2013-07-15 31 views
5

我可以使用aggregate()以更多功能以聚合存儲爲單獨列而不是矩陣的一部分嗎?我想有數據幀與列Group.1, cyl.1, cyl.2,而不是Group.1, cyl具有更多功能的集合() -

# 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。我想分享這個選項,因爲我喜歡它的語法好得多,但它沒有解決關於如何處理'aggregate'輸出的實際問題,這是我之前遇到的,並且發現處理有些尷尬。 – A5C1D2H2I1M1N2O1R2T1

+0

@AnandaMahto我同意,它不回答這個問題(只要你的問題是它的答案),但我基本上認爲OP是問錯了問題:) – eddi

+1

我剛剛發現[我的來源答案](http://stackoverflow.com/a/14759569/1270695)。還有一些類似的問題,但這是我學習'do.call(data.frame,...)'方法的地方。 – A5C1D2H2I1M1N2O1R2T1