加速嵌套循环; 它可以被矢量化吗?

asj*_*son 3 performance loops for-loop runtime r

我试图匹配一些可能是一个相当大的数据集的数据,甚至在中等大小的数据集上它需要太长时间.

我正在执行的任务是解决机械问题,然后回溯6个月并查找程序问题(个别员工的失败).我首先在机器和位置匹配,所以我想用同一台机器匹配相同的地方.然后我要求程序错误出现在机械错误之前,因为它在将来.最后,我将它限制在180天以保持可比性.

在数据构建阶段,我限制机械问题以排除前6个月,因此我每个都有相同的180天块.

我已经阅读了很多关于优化循环的内容.我知道你想在循环之外创建一个存储变量,然后只是添加它,但我实际上并不知道它将返回多少匹配,所以最初我一直在循环中使用rbind.我知道存储变量的上限是机械问题的数量*程序问题的数量,但这是巨大的,我不能分配一个大的矢量.我在这里放置的代码有我最大的存储变量方法,但我想我必须回到这样的事情:

if (counter == 1) {
    pro = procedural[i, ]
    other = mechanical[j, ]
}
if (counter != 1) {
    pro = rbind(pro, procedural[i, ])
    other = rbind(other, mechanical[j, ])
}
Run Code Online (Sandbox Code Playgroud)

我也读了很多关于矢量化的内容,但我从来没有真正设法让它工作.我在矢量化方面尝试了一些不同的东西,但我认为我一定做错了.

我也尝试删除第二个循环并只使用which命令,但这似乎不适用于与单个值(来自机械数据)进行比较的完整数据列(来自过程数据).

这是我目前的代码.它适用于小型数据集,但对于任何远程大的数据,它都需要永远.

maxval = mechrow * prorow
pro = matrix(nrow = maxval, ncol = ncol(procedural))
other = matrix(nrow = maxval, ncol = ncol(procedural))
numprocissues = matrix(nrow = mechrow, ncol = 1)
counter = 1
for (j in 1:mechrow) {
    for (i in 1:prorow) {
        if (procedural[i, 16] == mechanical[j, 16] &
            procedural[i, 17] < mechanical[j, 17] &
            procedural[i, 2] == mechanical[j, 2] &
            abs(procedural[i, 17] - mechanical[j, 17]) < 180) {

            pro[counter, ] = procedural[i, ]
            other[counter, ] = mechanical[j, ]
            counter = counter + 1
        }
    }
    numprocissues[j, 1] = counter
}
Run Code Online (Sandbox Code Playgroud)

我想象的改进的地方可以是我的存储变量,潜在的矢量化,改变if语句中的条件,或者可能是想要删除循环的语句.

任何建议将不胜感激!

谢谢.

Aar*_*ica 6

未经测试...

xy <- expand.grid(mech=1:mechrow, pro=1:prorow)
ok <- (procedural[xy$pro, 16] == mechanical[xy$mech, 16] &
       procedural[xy$pro, 17] <  mechanical[xy$mech, 17] &
       procedural[xy$pro,  2] == mechanical[xy$mech,  2] &
       abs(procedural[xy$pro, 17] -  mechanical[xy$mech, 17]) < 180)
pro   <- procedural[xy$pro[ok],]
other <- mechanical[xy$mech[ok],]
numprocissues <- tapply(ok, xy$mech, sum)
Run Code Online (Sandbox Code Playgroud)