[R] use of ddply() within function

Jeff Newmiller jdnewmil at dcn.davis.CA.us
Thu Sep 6 14:55:36 CEST 2012


As the footer says, "provide commented, _minimal_, self-contained, reproducible code."
This is hardly "minimal" or reproducible.

Anyway, this probably ought to qualify as a plyr FAQ of some sort: don't use the summarise function as the FUN argument within a function. Define a named or anonymous function of your own as the help page for ddply describes. Too many layers of syntactic sugar are involved for summarise to work within a function.
---------------------------------------------------------------------------
Jeff Newmiller                        The     .....       .....  Go Live...
DCN:<jdnewmil at dcn.davis.ca.us>        Basics: ##.#.       ##.#.  Live Go...
                                      Live:   OO#.. Dead: OO#..  Playing
Research Engineer (Solar/Batteries            O.O#.       #.O#.  with
/Software/Embedded Controllers)               .OO#.       .OO#.  rocks...1k
--------------------------------------------------------------------------- 
Sent from my phone. Please excuse my brevity.

Franckx Laurent <laurent.franckx at vito.be> wrote:

>Dear all,
>
>I am encountering problems with the application of ddply within the
>body of a self-defined function.
>
>The script is the following:
>
>
>moncostcarmoto <- function(costtype){
>                costaux_result <- data.frame()
>                for (purp in PURPcount){for (per in PERcount){
>                 costcarin = paste(c("CS_",costtype,"CAR"),collapse="")
>               costmotoin = paste(c("CS_",costtype,"MOTO"),collapse="")
>                               browser()
>COSTaux_AVCAR         <-
>ddply(CARaux,c("SC","YEAR"),summarize,costcsolo =
>sum(CARaux[[costcarin]]))
>COSTaux_AVMOTO        <-
>ddply(CARaux,c("SC","YEAR"),summarize,costmoto=
>sum(CARaux[[costmotoin]] ))
>COSTaux               <-
>join(COSTaux_AVCAR,COSTaux_AVMOTO,by=c("SC","YEAR"))
>                               COSTaux[ ,"PURP"]     <- as.factor(purp)
>                               COSTaux[ ,"PER"]      <- as.factor(per)
>                        costaux_result <- rbind(costaux_result,COSTaux)
>                               }}
>
>                return(costaux_result)
>}
>
>Summarizing what it is supposed to do:
>
>
>*         In previous step of our analysis, we have constructed a
>dataframe, CARaux. CARaux represents different cost categories (fuel
>prices, taxes, maintenance) etc for cars and motorcycles. The costs are
>differentiated according to the projection year ("YEAR") considered,
>the policy scenario considered ("SC") and the car type considered.
>
>*         The function moncostcarmoto takes as only argument one of
>four possible aggregate cost types: "MONCOST_EXCLTAX",
>"TAX",""FUELCOST" and "MONCOST_INCLTAX"".
>
>*         The output of the function is a  summary of the costs per
>YEAR and SCENARIO, represented for all possible trip purposes
>(enumerated in PURPcount) and period of the day (enumerated in
>PERcount). Note that these costs do not depend on PURP and PER in the
>base scenario, but this is something I may want to modify in the future
>(and which explains why I iterate over these categories).
>
>The function fails in the following line:
>
>COSTaux_AVCAR         <-
>ddply(CARaux,c("SC","YEAR"),summarize,costcsolo =
>sum(CARaux[[costcarin]]))
>
>With the following error message:
>
>Error in (function(x, i, exact) if (is.matrix(i)) as.matrix(x)[[i]]
>else .subset2(x,  :
>  object 'costcarin' not found
>
>When I debugged the function, I found the following:
>
>Browse[1]> costcarin
>[1] "CS_MONCOST_EXCLTAXCAR"
>Browse[1]> summary(CARaux[[costcarin]])
>     Min.   1st Qu.    Median      Mean   3rd Qu.      Max.
>0.0000000 0.0000000 0.0001605 0.0166700 0.0048570 0.1633000
>Browse[1]> COSTaux_AVCAR         <-
>ddply(CARaux,c("SC","YEAR"),summarize,costcsolo =
>sum(CARaux[["CS_MONCOST_EXCLTAXCAR"]]))
>Browse[1]> summary(COSTaux_AVCAR)
>   SC                       YEAR                     costcsolo
>  BAU:31              Min.   :2000        Min.   :6.202
>                                1st Qu.:2008      1st Qu.:6.202
>                                Median :2015   Median :6.202
>                                Mean   :2015       Mean   :6.202
>                               3rd Qu.:2022      3rd Qu.:6.202
>                                Max.   :2030       Max.   :6.202
>Browse[1]> COSTaux_AVCAR         <-
>ddply(CARaux,c("SC","YEAR"),summarize,costcsolo =
>sum(CARaux[[costcarin]]))
>Error in (function(x, i, exact) if (is.matrix(i)) as.matrix(x)[[i]]
>else .subset2(x,  :
>  object 'costcarin' not found
>
>
>Thus, providing CARaux[["CS_MONCOST_EXCLTAXCAR"]] as an argument to
>ddply() works, but CARaux[[costcarin]] does not, although costcarin =
>"CS_MONCOST_EXCLTAXCAR".
>
>
>Best regards
>Laurent
>
>
>
>
>
>________________________________
>VITO Disclaimer: http://www.vito.be/e-maildisclaimer
>
>	[[alternative HTML version deleted]]
>
>______________________________________________
>R-help at r-project.org mailing list
>https://stat.ethz.ch/mailman/listinfo/r-help
>PLEASE do read the posting guide
>http://www.R-project.org/posting-guide.html
>and provide commented, minimal, self-contained, reproducible code.




More information about the R-help mailing list