很容易重複data.frame一次,如何重複data.frame?
mt2 <- rbind(mtcars, mtcars)
但是,什麼是一個R類似的方式,一般做到這一點?如果我想的mtcars
10份在一起我可以
mt10 <- mtcars
for (i in 2:10) mt10 <- rbind(mt10, mtcars)
這是很多簡潔,但是在河的精神似乎不是有沒有更好的方式來做到這一點,或使用矢量循環聰明的把戲?
很容易重複data.frame一次,如何重複data.frame?
mt2 <- rbind(mtcars, mtcars)
但是,什麼是一個R類似的方式,一般做到這一點?如果我想的mtcars
10份在一起我可以
mt10 <- mtcars
for (i in 2:10) mt10 <- rbind(mt10, mtcars)
這是很多簡潔,但是在河的精神似乎不是有沒有更好的方式來做到這一點,或使用矢量循環聰明的把戲?
這裏是一個非常簡單的方法:
mtcars[rep(1:nrow(mtcars),2),]
或使用更好的「語法」:
mtcars[rep(seq_len(nrow(mtcars)),2),]
由於GSEE低於所指出的,在這裏一個不同之處在於rbind
將準確複製的行名,而使用索引將通過附加數字強制唯一的行名稱。除了我的頭頂,我認爲唯一的解決辦法是在事後設置排名(再次使用rep
)。
@喬蘭的答案非常優雅,你應該使用它,如果重複rownames是不需要的。然而,這種方式也將複製rownames:
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)代表將不會再現行名稱;這是一個單獨的步驟。 2)mefa::rep(mtcars,10)
不起作用:Error: 'rep' is not an exported object from 'namespace:mefa'
。另外mefa:::rep(mtcars,10)
給出object 'rep' not found
。不知道這是爲什麼...
dplyr
爲基礎的解決方案(從here)
library(dplyr)
mtcars %>% slice(rep(1:n(), 2)) # 2 copies of data frame
雖然給出不同rownames,所以'相同(rbind(mtcars,mtcars),mtcars [代表(1:nrow (mtcars),2),])'is FALSE – GSee
'rep(mtcars,10)'不起作用,我很失望,但當然這是用'rep'去解決它的方法。 – Gregor