It\'s easy to repeat a data.frame once,
mt2 <- rbind(mtcars, mtcars)
But what\'s an R-like way to do this generally? If I want 10 copies
dplyr
-based solution (from here)
library(dplyr)
mtcars %>% slice(rep(1:n(), 2)) # 2 copies of data frame
Here's a very simple method:
mtcars[rep(1:nrow(mtcars),2),]
or using better "grammar":
mtcars[rep(seq_len(nrow(mtcars)),2),]
As GSee notes below, one difference here is that rbind
will replicate the row names exactly, while using indexing will force unique row names by appending digits. Off the top of my head, I think the only fix would be to set the row names (again using rep
) after the fact.
If you can tolerate another package:
require(mefa)
rep(mtcars,10)
It appears a little faster:
system.time(mtcars[rep(1:nrow(mtcars),1e5),])
system.time(mtcars[rep(seq_len(nrow(mtcars)),1e5),])
system.time(rep(mtcars,1e5))
Gives:
user system elapsed
17.41 0.19 17.89
17.11 0.31 17.91
6.79 0.70 7.67
Caveats: 1) rep will not reproduce the row names; this is a separate step. 2) mefa::rep(mtcars,10)
doesn't work as: Error: 'rep' is not an exported object from 'namespace:mefa'
. Also mefa:::rep(mtcars,10)
gives object 'rep' not found
. Not sure why this is...
@joran's answer is very elegant and you should use it if duplicating the rownames isn't required. However, this way will also duplicate the rownames:
do.call(rbind, replicate(10, mtcars[1:10, ], simplify=FALSE))