具有变量列表的聚合函数

时间:2014-03-21 18:45:12

标签: r

我试图创建一个R脚本来汇总数据框中的度量。我希望它能动态地响应数据帧结构的变化。例如,我有以下块。

library(plyr) #loading plyr just to access baseball data frame
MyData <- baseball[,cbind("id","h")]
AggHits <- aggregate(x=MyData$h, by=list(MyData[,"id"]), FUN=sum)

此块创建一个数据框(AggHits),其中包含每个玩家的总命中(h)(id)。耶。

假设我想引进团队。如何更改by参数,以便AggHits具有&#34; id&#34;的每个组合的总点击次数。和&#34;团队&#34;?我尝试了以下内容,第二行抛出错误:参数必须具有相同的长度

MyData <- baseball[,cbind("id","team","h")]
AggHits <- aggregate(x=MyData$h, by=list(MyData[,cbind("id","team")]), FUN=sum)

更一般地说,我想编写第二行,以便它自动聚合h除了h之外的所有变量。我可以使用setdiff非常容易地生成要分组的变量列表。

# set the list of variables to summarize by as everything except hits
SumOver <- setdiff(colnames(MyData),"h")

# total up all the hits - again this line throws an error
AggHits <- aggregate(x=MyData$h, by=list(MyData[,cbind(SumOver)]), FUN=sum)

我使用它的商业目的涉及一个csv文件,该文件只有一个度量($),目前有大约六个维度(产品,客户,州代码,日期等)。我希望能够在不必每次都编辑脚本的情况下为csv文件添加维度。

我应该提到我已经能够使用ddply完成此任务,但我知道使用ddply来总结一个单一的措施对于运行时来说是浪费;聚合速度要快得多。

提前致谢!

答案(具体到相关示例) 阻止应该是

MyData <- baseball[,cbind("id","team","h")]
SumOver <- setdiff(colnames(MyData),"h")
AggHits <- aggregate(x=MyData$h, by=MyData[SumOver], FUN=sum)

2 个答案:

答案 0 :(得分:4)

这会聚合每个非整数列(ID,团队,联盟),但更一般地显示聚合在任意列列(by=MyData[cols.to.group.on])上的策略:

MyData <- plyr::baseball
cols <- names(MyData)[sapply(MyData, class) != "integer"]
aggregate(MyData$h, by=MyData[cols], sum)

答案 1 :(得分:1)

以下是使用基础R的aggregate的解决方案

data(baseball, package = "plyr")

MyData  <- baseball[,c("id","h", "team")]
AggHits <- aggregate(h ~ ., data = MyData, sum)