Как я могу повторить 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