2015-04-03 4 views
2

У меня есть набор данных, который выглядит следующим образом один:Увеличение скорости с rbindlist не работает с двумя петлями для

test <- data.table(Weight=sample(x = c(20:100),500,replace = T),y=rnorm(500),z=rnorm(500)) 

> head(test) 
    Weight   y   z 
1:  87 -0.7946846 -0.03136408 
2:  97 1.6570765 0.61080309 
3:  80 1.1592073 -0.09389739 
4:  23 -0.0268602 -1.36896141 
5:  32 1.3171078 -2.19978789 
6:  78 -0.1961162 0.62026338 

Я хочу, чтобы дублировать каждую строку столько раз, сколько значения при weight.I достигли этого со следующим кодом: (я включил прогрессбар)

system.time(
    for (i in 1:nrow(test)){ 
    setTxtProgressBar(pb,i) 
    for (j in 1:test[i,]$Weight){ 
     Testoutcome <- rbind(Testoutcome, test[i,]) 
    } 
    }) 
user system elapsed 
    32.91 0.08 33.57 

Я нашел пост here, который объясняет, что rbindlist гораздо быстрее, чем rbind. Поэтому я изменил код следующим образом:

system.time(
    for (i in 1:nrow(test)){ 
    setTxtProgressBar(pb,i) 
    for (j in 1:test[i,]$Weight){ 
     Testoutcome <- rbindlist(list(Testoutcome, test[i,])) 
    } 
    }) 
user system elapsed 
    27.72 0.05 28.31 

Так что, похоже, это не так эффективно. Мой фактический набор данных примерно в 1.000 раз больше, и запрос берется навсегда ... Любые идеи о том, как ускорить работу? Может быть, я должен получить привязку за пределами цикла?

+0

Это может иметь значение: http://stats.stackexchange.com/questions/25148/how-to-expand-data-frame-in -r – Frank

+0

Ах, и вот точное совпадение, хотя он не спрашивает о скорости: http://stackoverflow.com/questions/19518728/r-replicate-each-row-of-an-r-data-frame- и-define-of-of-replications – Frank

ответ

4

Это должно быть быстрым, и довольно просто:

test[rep(1:.N,Weight)] 
+1

Спасибо, слишком много фокусировался на rbind и rbindlist. –