From dwinsemius at comcast.net  Tue Aug  2 16:14:59 2011
From: dwinsemius at comcast.net (David Winsemius)
Date: Tue, 2 Aug 2011 10:14:59 -0400
Subject: [Rd] 'data.frame' method for base::rep()
In-Reply-To: <CABxs9VmouqjKpNvkzG5emHevXQtTRo9f81nxhOS9FvBo5V4maw@mail.gmail.com>
References: <CABxs9VmouqjKpNvkzG5emHevXQtTRo9f81nxhOS9FvBo5V4maw@mail.gmail.com>
Message-ID: <7EDF51C9-0E2A-47CA-81BF-3C73050D2B36@comcast.net>


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"

> I found a 'rep.data.frame' function in package 'mefa' [2], but I think
> it would be nice to have it in base R. In any case, the code used by
> the method is very simple.
>> require(mefa)
> Loading required package: mefa
> mefa 3.2-1 	 2011-05-13
>> mefa:::rep.data.frame
> function (x, ...)
> as.data.frame(lapply(x, rep, ...))
> <environment: namespace:mefa>
>
> And here's the example above:
>> rep(x, 2)
>  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
> 1          5.1         3.5          1.4         0.2  setosa
> 2          5.1         3.5          1.4         0.2  setosa
>

I do not think the mefa 'rep.data.frame' code is a good example to  
replicate ... as it were. It strips classes from any column that does  
not have an associated 'rep' method, and the repetoire (we are in some  
kind of self-referential loop here) of rep.* methods is pretty meager.

My initial thought was that the expected functionality would be found  
with "[" using the template:

  dfrm[rep(vec, times/each= vec2) , ]

It appears "[" proves would preserve classes for a much larger range.

methods("[")

 > x <- data.frame(a = as.Date('2000-01-01'), b=as.Date('2001-01-01'))
 > x$d <- x$a -x$b
 > require(mefa)
 > rep(x, 2)
            a          b    d
1 2000-01-01 2001-01-01 -366
2 2000-01-01 2001-01-01 -366
 > str(rep(x,2))
'data.frame':	2 obs. of  3 variables:
  $ a: Date, format:  ...
  $ b: Date, format:  ...
  $ d: num  -366 -366   # notice that a difftime object has lost its  
class

# Whereas using the [rep(. , .) , ] approach does preserve the  
difftime class.
 > str(x[rep(1,2) , ])
'data.frame':	2 obs. of  3 variables:
  $ a: Date, format:  ...
  $ b: Date, format:  ...
  $ d:Class 'difftime'  atomic [1:2] -366 -366   # leap year
   .. ..- attr(*, "units")= chr "days"

Since that works out of the box with fewer potential side-effects, I  
am not sure a new method is needed.

-- 
David.
>
> Please le t me know what you think. Regards
> Liviu
>
> [1] http://finzi.psych.upenn.edu/R/library/mefa/html/rep.data.frame.html
> [2] http://cran.at.r-project.org/web/packages/mefa/index.html
>
>
> -- 


David Winsemius, MD
West Hartford, CT



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