简体   繁体   中英

R: using ddply with a function

I'm trying to use the "ddply" function in conjunction with the "summarize" function, but I'm having difficulty.

Below is an extract of my code:

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

"merged" is the matrix containing the information that I would like to summarize. I am summarizing by columns "RIC" and "leg". The problem I am having is applying a function to the fill.Price column.

This is an extract from the "merged" matrix:

 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 

Essentially, what the code above is trying to do is aggregate the fill.Quant column by RIC and leg, and then populate the corresponding fill.Price column with [(fill.Price*fill.Quant)/fill.Quant], resulting in a matrix as given below:

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

Any help would be greatly appreciated. Let me know if anything is unclear.

Thanks!

Mike

It looks like it should be

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

You can also use an anonymous function:

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

another solution, which gives you code which is IMHO easily readable and reusable you could do:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM