4

重复一次data.frame很容易,

mt2 <- rbind(mtcars, mtcars)

但是一般来说,类似 R 的方法是什么?如果我想要 10 份mtcars一起,我可以

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

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

4

4 回答 4

8

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

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

或使用更好的“语法”:

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

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

于 2012-11-07T17:50:31.633 回答
6

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

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

于 2012-11-07T17:59:48.150 回答
3

如果您可以忍受另一个包裹:

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)rep 不会复制行名;这是一个单独的步骤。2)mefa::rep(mtcars,10)不能作为:Error: 'rep' is not an exported object from 'namespace:mefa'. mefa:::rep(mtcars,10)还给object 'rep' not found. _ 不知道这是为什么...

于 2012-11-09T21:53:27.730 回答
1

dplyr基于解决方案(从这里

library(dplyr)
mtcars %>% slice(rep(1:n(), 2))  # 2 copies of data frame
于 2018-03-02T14:48:39.630 回答