避免使用for循环

时间:2010-06-02 10:37:58

标签: optimization r loops

我正在使用R,我有一个这样的代码:

for (i in 1:10)
   for (j in 1:100)
        if (data[i] == paths[j,1])
            cluster[i,4] <- paths[j,2]

其中:

  • data是一个包含100行和1列
  • 的向量
  • paths是一个包含100行和5列的矩阵
  • cluster是一个包含100行和5列的矩阵

我的问题是:如何避免使用“for”循环遍历矩阵?我不知道apply函数(lapplytapply ...)在这种情况下是否有用。

例如,j=10000这是一个问题,因为执行时间很长。

谢谢

2 个答案:

答案 0 :(得分:1)

内环可以进行矢量化

cluster[i,4] <- paths[max(which(data[i]==paths[,1])),2]

但请查看Musa的评论。我认为你缩进了别的东西。

第二个(外部)循环可以通过复制矢量来进行矢量化,但

  1. 如果i只有100,那么你的加速不会很大
  2. 它需要更多内存

  3. [编辑] 据我了解你的评论你可以使用逻辑索引吗?

    indx <- data==paths[, 1]
    cluster[indx, 4] <- paths[indx, 2]
    

答案 1 :(得分:1)

我认为可以使用以下方法对两个循环进行矢量化:

cluster[na.omit(match(paths[1:100,1],data[1:10])),4] = paths[!is.na(match(paths[1:100,1],data[1:10])),2]