【问题标题】:Aggregate Function with Variable By List按列表聚合函数
【发布时间】: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


    【解决方案1】:

    这按每个非整数列(ID、Team、League)聚合,但更一般地显示了一种聚合任意列列表的策略 (by=MyData[cols.to.group.on]):

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

    【讨论】:

    • 您可以将其简化为aggregate(h ~ ., data = MyData[sapply(MyData, class) != "integer"], sum)
    • @Ramnath,我拆分了cols 部分,以表明你可以在cols 中放入任何你想要的东西。在任何一种方法下,实际的aggregate 语句都具有类似的简单性。我个人认为aggregate.data.frame 版本对于不太熟悉 R 的人来说更直观。
    • 感谢您的帮助先生们。我的脚本正在运行。
    • @BrodieG 你说得对,公式界面可能会让 R 新手感到困惑。
    【解决方案2】:

    这是使用来自基本 R 的aggregate 的解决方案

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

    【讨论】:

    • 这是有道理的。问题是我不想汇总数据中的其他字段。例如我有执行服务的日期和支付发票的日期。我想在摘要中包含付款日期并保留服务日期...
    • 我想我有个主意。我可以从 data 参数中删除那些其他字段。让我试试这个。
    • 您的示例有效,但是当我尝试将其扩展到我的业务数据时,我收到“没有要聚合的行”的错误。是否存在与点表示法不兼容的某些数据类型?
    • 只要hnumeric,这应该可以工作。数据框中其他列的类是什么?
    • 这是数据内容问题。其中一列存在类型问题,每条记录都设置为 N/A。
    猜你喜欢
    • 2011-09-05
    • 2019-01-31
    • 2017-10-18
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-11
    相关资源
    最近更新 更多