Как я могу повторить data.frame?

Повторить data.frame один раз легко,

mt2 <- rbind(mtcars, mtcars)

Но каков R-подобный способ сделать это вообще? Если я хочу 10 копий mtcars вместе я мог

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

что достаточно кратко, но, похоже, не в духе R. Есть ли лучший способ сделать это или умный трюк с использованием векторной переработки?

4 ответа

Решение

Вот очень простой метод:

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) представитель не будет воспроизводить имена строк; это отдельный шаг. 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
Другие вопросы по тегам