具有更多功能的集合() -
问题描述:
我可以使用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
答
敷在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, ...)
的方法。
(来考虑该怎么寻找后@詹姆斯添加了相同的答案,因为我没有和他删除了....)
答
这里有不同的想法 - 切换到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>
+1。我想分享这个选项,因为我喜欢它的语法好得多,但它没有解决关于如何处理'aggregate'输出的实际问题,这是我之前遇到的,并且发现处理有些尴尬。 – A5C1D2H2I1M1N2O1R2T1
@AnandaMahto我同意,它不回答这个问题(只要你的问题是它的答案),但我基本上认为OP是问错了问题:) – eddi
我刚刚发现[我的来源答案](http://stackoverflow.com/a/14759569/1270695)。还有一些类似的问题,但这是我学习'do.call(data.frame,...)'方法的地方。 – A5C1D2H2I1M1N2O1R2T1