一次重复data.frame很容易,
mt2 <- rbind(mtcars, mtcars)
但是一般来说,这是一种类似R的方式吗?如果我想要10份mtcars
,我可以
mt10 <- mtcars
for (i in 2:10) mt10 <- rbind(mt10, mtcars)
这很简洁,但似乎不符合R的精神。是否有更好的方法来做到这一点,或使用矢量回收的巧妙技巧?
答案 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