2012-11-07 38 views
4

很容易重複data.frame一次,如何重複data.frame?

mt2 <- rbind(mtcars, mtcars) 

但是,什麼是一個R類似的方式,一般做到這一點?如果我想的mtcars 10份在一起我可以

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

這是很多簡潔,但是在河的精神似乎不是有沒有更好的方式來做到這一點,或使用矢量循環聰明的把戲?

回答

6

這裏是一個非常簡單的方法:

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

或使用更好的「語法」:

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

由於GSEE低於所指出的,在這裏一個不同之處在於rbind將準確複製的行名,而使用索引將通過附加數字強制唯一的行名稱。除了我的頭頂,我認爲唯一的解決辦法是在事後設置排名(再次使用rep)。

+0

雖然給出不同rownames,所以'相同(rbind(mtcars,mtcars),mtcars [代表(1:nrow (mtcars),2),])'is FALSE – GSee

+0

'rep(mtcars,10)'不起作用,我很失望,但當然這是用'rep'去解決它的方法。 – Gregor

6

@喬蘭的答案非常優雅,你應該使用它,如果重複rownames是不需要的。然而,這種方式也將複製rownames:

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

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。不知道這是爲什麼...

+2

因爲'mefa'提供的是data.frames的'rep'方法,所以'mefa ::: rep.data.frame(mtcars,10)'有效。 – Gregor

+0

謝謝。錯過了。 – dardisco

+2

另外,看'mefa ::: rep.data.frame',這是一個單行程,所以不需要加載包。 'rep.data.frame < - function(x,...)as.data.frame(lapply(x,rep,...))' – Gregor

1

dplyr爲基礎的解決方案(從here

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