【问题标题】:R: using ddply with a functionR:将 ddply 与函数一起使用
【发布时间】:2013-12-04 10:22:21
【问题描述】:

我正在尝试将“ddply”功能与“summarize”功能结合使用,但遇到了困难。

以下是我的代码摘录:

  orderSubsConsolidate = ddply(merged, .(RIC,leg),summarize,fill.Quant = sum(fill.Quant),
                 fill.Price = function(merged){sum(merged[,7]*merged[,8])/sum(merged[,7})

“合并”是包含我想总结的信息的矩阵。我按列“RIC”和“leg”进行总结。我遇到的问题是将函数应用于 fill.Price 列。

这是从“合并”矩阵中提取的:

Trade      RIC    leg Basket.Name Status  Order.Msg   fill.Quant  fill.Price
  ATNATNP ATNJ.J  1   ATNATNP1a1  Filled               100           200       
  ATNATNP ATNPp.J 2   ATNATNP2a1  Filled               100           200       
  ATNATNP ATNJ.J  1   ATNATNP1b1                       300           400

本质上,上面的代码试图做的是通过 RIC 和 leg 聚合 fill.Quant 列,然后用 [(fill.Price*fill.Quant)/fill.Quant] 填充相应的 fill.Price 列,得到一个矩阵,如下所示:

RIC      leg  fill.Quant  fill.Price
ATNJ.J    1      400            350
ATNPp.J   2      100            350  

任何帮助将不胜感激。如果有任何不清楚的地方,请告诉我。

谢谢!

迈克

【问题讨论】:

    标签: r plyr


    【解决方案1】:

    应该是这样的

    orderSubsConsolidate = ddply(merged, .(RIC,leg), summarize,
                           fill.Quant = sum(fill.Quant),
                           fill.Price = weighted.mean(fill.Price, fill.Quant))
    

    【讨论】:

    • +1 用于使用summarize,但最重要的是,用它们的变量名称替换这些丑陋且不可靠的索引(7 和8)。恕我直言,这应该是公认的答案。
    【解决方案2】:

    你也可以使用匿名函数:

    ddply(merged, .(RIC,leg), function(x) 
                               data.frame( fill.Quant = sum(x$fill.Quant), 
                                           fill.Price = sum(x[,7]*x[,8])/sum(x[,7])))
    

    【讨论】:

      【解决方案3】:

      另一种解决方案,它为您提供恕我直言易读和可重复使用的代码,您可以这样做:

      foo <- function(quant, price){
        sum( quant*price ) / sum(price)
      }
      
      ubsConsolidate <- ddply( merged, .(RIC,leg), summarize,
        fill.Quant = sum( fill.Quant ),
        fill.Price = foo( fill.Quant, fill.Price )
      )
      

      【讨论】:

      • 与@Stephen 的没有太大区别......它甚至有我在他的文章中修正过的相同错误:你没有做一个真正的加权平均值,你需要除以sum(price)。
      • @flodel,是的,感谢您指出错误。然而,问题在于如何将自写(可能是匿名)函数与ddply 和summarise 一起使用。将特定功能简化为已经实现的weighted.mean 是另一回事。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-17
      • 2012-06-26
      相关资源
      最近更新 更多