【发布时间】:2014-03-21 18:45:12
【问题描述】:
我正在尝试创建一个 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),其中包含每个玩家 (id) 的总点击数 (h)。耶。
假设我想引入团队。如何更改 by 参数,以便 AggHits 具有“id”和“team”的每个组合的总命中数?我尝试了以下方法,第二行抛出错误:参数必须具有相同的长度
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 来汇总单个度量在运行时间方面是浪费的;聚合要快得多。
提前致谢!
ANSWER(特定于相关示例) 块应该是
MyData <- baseball[,cbind("id","team","h")]
SumOver <- setdiff(colnames(MyData),"h")
AggHits <- aggregate(x=MyData$h, by=MyData[SumOver], FUN=sum)
【问题讨论】:
标签: r