Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何重复data.frame?_R_Dataframe - Fatal编程技术网

如何重复data.frame?

如何重复data.frame?,r,dataframe,R,Dataframe,重复一次data.frame很容易 mt2 <- rbind(mtcars, mtcars) 这非常简洁,但似乎不符合R的精神。有没有更好的方法来做到这一点,或者是使用向量回收的巧妙方法?这里有一个非常简单的方法: mtcars[rep(1:nrow(mtcars),2),] 或者使用更好的“语法”: 正如GSee在下面所指出的,这里的一个区别是,rbind将精确复制行名,而使用索引将通过追加数字强制使用唯一的行名。在我脑海中,我认为唯一的解决办法是在事后设置行名(再次使用rep)。@

重复一次data.frame很容易

mt2 <- rbind(mtcars, mtcars)

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

这里有一个非常简单的方法:

mtcars[rep(1: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)
不起作用:
错误:“rep”不是从“namespace:mefa”导出的对象。
。另外
mefa:::rep(mtcars,10)
给出
未找到对象“rep”
。不确定为什么这是基于dplyr的解决方案(来自)


虽然这给出了不同的行名,所以
相同(rbind(mtcars,mtcars),mtcars[rep(1:nrow(mtcars),2),])
是错误的我对
rep(mtcars,10)
不起作用感到失望,但当然这是
rep
的方法。因为
mefa
提供的是一种
rep
数据帧方法,因此
mefa:::rep.data.frame(mtcars,10)
起作用。另外,查看
mefa:::rep.data.frame
,它是一个单行程序,因此不需要加载包<代码>rep.data.frame
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
library(dplyr)
mtcars %>% slice(rep(1:n(), 2))  # 2 copies of data frame