[Rd] 'data.frame' method for base::rep()

Martin Maechler maechler at stat.math.ethz.ch
Wed Aug 3 14:44:20 CEST 2011

>>>>> David Winsemius <dwinsemius at comcast.net>
>>>>>     on Tue, 2 Aug 2011 10:14:59 -0400 writes:

    > On Aug 2, 2011, at 7:55 AM, Liviu Andronic wrote:

    >> Dear R developers Would you consider adding a
    >> 'data.frame' method for the base::rep function? The need
    >> to replicate a df row-wise can easily arise while
    >> programming, and rep() is unable to handle such a
    >> case. See below.
    >>> x <- iris[1, ]
    > x[ rep(1,2), ] # "works"

Yes, indeed, and that I think is my "definitive" answer
to the proposal.
Defining a rep() method for data frames seems much less sensible
First because one simple "substitute" exists (namely indexing,
see above), and to me, not the least because there are several problems /
questions that would have to be answered

- Why should rep() for data frame necessarily replicate rows and
  not columns?
- If some rows should be resampled, why each row exactly the
  same number of times?
- any solution that is not compatible to    x [ rep(i, k) , ]
  would be unsatisfactory
- What rownames should the new data frame get in case of "real"
  rownames (i.e., not the fast "1:n" pseudo-rownames)?
  The informal definition of a data frame says that the rownames
  must be unique.
  --> and of course, the indexing solution

     xx <- iris[ rep(1:nrow(iris), 3) , ]
  does implement one sensible way of producing unique row.names,
  {though, I must say, not the "optimal" one if the issue is efficiency}

Rather keep using [,] and let's not get into having to maintain
yet another data.frame method ..

Martin Maechler, ETH Zurich

More information about the R-devel mailing list