使用 rbindlist 提高速度不适用于两个 for 循环
Increase speed with rbindlist does not work with two for loops
我有一个看起来像这样的数据集:
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
我发现 post 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 倍,查询需要永远……有什么想法可以加快速度吗?也许我应该在循环外进行绑定?
这应该很快,而且很简单:
test[rep(1:.N,Weight)]
我有一个看起来像这样的数据集:
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
我发现 post 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 倍,查询需要永远……有什么想法可以加快速度吗?也许我应该在循环外进行绑定?
这应该很快,而且很简单:
test[rep(1:.N,Weight)]