2010-06-02 257 views
1

我与R工作使用的,我有这样的代码:避免for循环

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函数(lapply,tapply ...)在这种情况下是否有用。

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

谢谢

+0

我认为有些事情已经在这里翻译丢失了? – wkmor1 2010-06-02 11:54:12

+1

你是否打算真的把'最后匹配的'路径'保存在'集群'中? – teucer 2010-06-02 11:59:15

+0

是的,Musa和wkmor1说了些什么......你真的意思是我只能测试10个项目中的前10个项目吗? --- 你的问题的一般答案是,你必须开始思考矢量而不是单个项目。有很快的方法可以做到像你在做什么之类的事情,只要它有意义。 – John 2010-06-02 14:02:38

回答

1

内环可向量化

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

但检查穆萨的评论。我认为你缩进了别的东西。

二(外)环可要么向量化,通过复制的载体,但

  1. 如果i只有100的提速并不大
  2. 它将需要更多的内存

正如我理解你的评论,你可以只使用逻辑索引?

indx <- data==paths[, 1] 
cluster[indx, 4] <- paths[indx, 2] 
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] 
+0

我想知道矢量化解决方案的性能与循环替代方案相比。 – 2010-06-04 06:59:35

+0

@Guido在这种特殊情况下,很难说原始循环的结果与gd047解决方案的结果不同,但循环和矢量化代码之间的差异可能会很大。检查我的答案http://stackoverflow.com/questions/2908822/speed-up-the-loop-operation-in-r,从几小时你可以去秒不到。 – Marek 2010-06-04 19:40:10

+0

@Marek使用随机化测试矩阵我使用这两种方法得到相同的聚类矩阵。我使用'all.equal(loop_sol,vect_sol)'检查了结果'哪些是您使用过的测试矩阵并给了您不同的结果? – 2010-06-04 20:25:58