[R] dots expansion
Liaw, Andy
andy_liaw at merck.com
Wed Aug 4 16:24:55 CEST 2004
In addition to Gabor's comments:
There's a reason why I didn't coerce the grouping variable to a factor.
rbind()ing data frames is much more expensive than rbind()ing
arrays/matrices. Unless your data really have different data types in
different columns, it would mostly likely be better to work with the matrix
version of them. If you really want a data frame with the grouping variable
as a factor, you can do the coercion afterward.
Andy
> From: Gabor Grothendieck
>
> Viet Nguyen <vietnguyen <at> fastmail.fm> writes:
>
> >
> > Thanks to all who helped.
> >
> > I used your ideas and code samples to write the following (for the
> > benefit of people who will search this list later):
> >
> > rbind.case <- function(..., name="case", values) {
> > dots <- list(...);
> > if (missing(values)) values <- 1:length(dots);
> > if (length(values)!=length(dots))
> > stop("length(values)!=length(list(...))");
> >
> > eval(parse(text=
> > paste("cbind(rbind(...), ",name,
> > "=rep(values, sapply(dots, nrow)))",sep="")));
> > }
> >
> > The function is to be used with data frames. It's not as
> good as it can
> > be but it works for my purpose.
>
> Regarding improvements, eliminate the semicolons at the end
> of statements,
> place the default value for values= in the arg list to make
> it more readable,
> use stopifnot to check args (also for readability), add a check for
> data frames (which is mentioned after the code but not checked for,
> and eliminate the eval and rep calculations by simply
> lapplying over an
> index and appending the name column to each data frame in turn:
>
>
> rbind.case <- function(..., name="case", values = seq(along =
> list(...)))
> # rbind the ... data frames together adding a column named name whose
> # value for rows from ith argument is values[i]
> {
> dots <- list(...)
> stopifnot(length(dots) == length(values),
> all(sapply(dots, inherits, "data.frame")))
>
> f <- function(i) { x <- dots[[i]]; x[,name] <- values[i]; x }
> do.call("rbind", lapply(seq(along = dots), f))
> }
>
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://www.stat.math.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide!
> http://www.R-project.org/posting-guide.html
>
>
More information about the R-help
mailing list