我怎样才能重复data.frame?

时间:2012-11-07 17:47:21

标签: r dataframe

一次重复data.frame很容易,

mt2 <- rbind(mtcars, mtcars)

但是一般来说,这是一种类似R的方式吗?如果我想要10份mtcars,我可以

mt10 <- mtcars
for (i in 2:10) mt10 <- rbind(mt10, mtcars)

这很简洁,但似乎不符合R的精神。是否有更好的方法来做到这一点,或使用矢量回收的巧妙技巧?

4 个答案:

答案 0 :(得分:6)

这是一个非常简单的方法:

mtcars[rep(1:nrow(mtcars),2),]

或使用更好的“语法”:

mtcars[rep(seq_len(nrow(mtcars)),2),]

正如下面的GSee所述,这里的一个区别是rbind将精确复制行名,而使用索引将通过附加数字强制使用唯一的行名。在我的脑海中,我认为唯一的解决方法是在事后设置行名称(再次使用rep)。

答案 1 :(得分:6)

@joran的答案非常优雅,如果不需要复制rownames,你应该使用它。但是,这种方式也会复制rownames:

do.call(rbind, replicate(10, mtcars[1:10, ], simplify=FALSE))

答案 2 :(得分:2)

如果你能容忍另一个包裹:

require(mefa)
rep(mtcars,10)
  • 毕竟是有效的!

看起来快一点:

system.time(mtcars[rep(1:nrow(mtcars),1e5),])
system.time(mtcars[rep(seq_len(nrow(mtcars)),1e5),])
system.time(rep(mtcars,1e5))

给出:

 user  system elapsed 
 17.41    0.19   17.89
 17.11    0.31   17.91
 6.79    0.70    7.67

警告:1)代表不会重现行名称;这是一个单独的步骤。 2)mefa::rep(mtcars,10)不起作用:Error: 'rep' is not an exported object from 'namespace:mefa'mefa:::rep(mtcars,10) object 'rep' not found也会{{1}}。不知道为什么会这样......

答案 3 :(得分:1)

基于

dplyr的解决方案(来自here

library(dplyr)
mtcars %>% slice(rep(1:n(), 2))  # 2 copies of data frame