2015-04-03 26 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 2015-04-03 14:04:27

+0

啊,这里有一个精确的匹配,虽然它不询问速度:http://stackoverflow.com/questions/19518728/r-replicate-each-row-of-an-r-data-frame-并指定复制数量 – Frank 2015-04-03 14:09:14

回答

4

这应该是快速的,而且是相当简单:

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

谢谢,过分关注rbind和rbindlist。 – 2015-04-03 14:38:32