【发布时间】:2011-11-30 04:22:19
【问题描述】:
我正在尝试匹配一些可能是相当大的数据集的数据,即使是中等规模的数据集也需要很长时间。
我正在执行的任务是解决机械问题,然后返回 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, ])
}
我也读过一些关于矢量化的文章,但我从未真正设法让它发挥作用。我在矢量化方面尝试了一些不同的方法,但我认为我一定做错了什么。
我还尝试删除第二个循环并仅使用 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
}
我认为可以改进的地方是我的存储变量、潜在的向量化、更改 if 语句中的条件,或者可能是花哨的哪个语句来删除循环。
任何建议将不胜感激!
谢谢。
【问题讨论】:
-
您能否发布一个小样本数据集以使您的代码可重现?
-
你读过 Patrick Burns 的 R inferno 吗?他谈到创建用于循环的对象,然后偶尔扩展它。任何一天都可以击败 rbind。 burns-stat.com/pages/Tutor/R_inferno.pdf
-
嗨,安迪!我觉得你的照片看起来很眼熟……
-
嗨亚伦!确实是我。 Stackedoverflow 很棒。
-
有谁知道如何在此处获得一张桌子或任何东西?我觉得我应该可以,但它并没有跳出来。
标签: performance r loops for-loop runtime