R:使用带有函数的ddply

时间:2013-12-04 10:22:21

标签: r plyr

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

以下是我的代码摘录:

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

“merged”是包含我想要总结的信息的矩阵。我按“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  

非常感谢任何帮助。如果有什么不清楚,请告诉我。

谢谢!

麦克

3 个答案:

答案 0 :(得分:7)

看起来应该是

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

答案 1 :(得分: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])))

答案 2 :(得分:2)

另一个解决方案,它为您提供了恕我直言的代码,您可以轻松阅读和重复使用:

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 )
)