重复一次data.frame很容易,
mt2 <- rbind(mtcars, mtcars)
但是一般来说,类似 R 的方法是什么?如果我想要 10 份mtcars
一起,我可以
mt10 <- mtcars
for (i in 2:10) mt10 <- rbind(mt10, mtcars)
这很简洁,但似乎不符合 R 的精神。有没有更好的方法来做到这一点,或者使用矢量回收的巧妙技巧?
这是一个非常简单的方法:
mtcars[rep(1:nrow(mtcars),2),]
或使用更好的“语法”:
mtcars[rep(seq_len(nrow(mtcars)),2),]
正如下面 GSee 所指出的,这里的一个区别是rbind
它将精确地复制行名,而使用索引将通过附加数字来强制唯一的行名。在我的脑海中,我认为唯一的解决方法是在rep
事后设置行名(再次使用)。
@joran 的答案非常优雅,如果不需要复制行名,您应该使用它。但是,这种方式也会复制行名:
do.call(rbind, replicate(10, mtcars[1:10, ], simplify=FALSE))
如果您可以忍受另一个包裹:
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
. _ 不知道这是为什么...
dplyr
基于解决方案(从这里)
library(dplyr)
mtcars %>% slice(rep(1:n(), 2)) # 2 copies of data frame