Optimization 避免使用for循环

Optimization 避免使用for循环,optimization,r,loops,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] for(1:10中的i) 对于(1:100中的j) if(数据[i]==路径[j,1]) 簇[i,4]内环可以矢量化 cluster[i,4] <- paths[max(which(data[i]==paths[,1])),2]

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

for (i in 1:10)
   for (j in 1:100)
        if (data[i] == paths[j,1])
            cluster[i,4] <- paths[j,2]
for(1:10中的i)
对于(1:100中的j)
if(数据[i]==路径[j,1])

簇[i,4]内环可以矢量化

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

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

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

我认为在翻译过程中丢失了一些东西?你真的打算在“集群”中保存最后匹配的“路径”吗?是的,穆萨和wkmor1所说的。。。你真的想让我10岁。。。仅测试100项向量数据中的前10项?——对你的问题的一般回答是,你必须从向量而不是单个项目开始思考。有很多更快的方法来做一些事情,比如你正在做的事情,只要它有意义。谢谢你们。我想做的是,当来自“数据”的值等于来自“路径”的值时,将值保存在第2列的集群第4列中,并避免使用“for”语句,因为当我有大量观测值时,计算时间会大幅增加,当它们不相等时,您想做什么?。。。他们只是被忽视了?。。。或者集群列4已经设置为除非满足此条件否则不会更改的内容。(听起来像一个简单的ifelse()命令--no loops--check help)我想知道向量化解决方案的性能与循环替代方案相比如何。@Guido在这种特殊情况下,很难说原始循环和gd047解决方案的结果不同,但一般来说,循环和向量化代码之间的差异可能很大。检查我的答案,从几个小时到不到一秒。@Marek使用随机测试矩阵,我使用这两种方法得到了相等的聚类矩阵。我使用
all.equal(loop\u sol,vect\u sol)
检查了结果,您使用了哪些测试矩阵,并给出了不同的结果?@gd047检查这个(太长,无法评论),我使用R-2.10。1@Marek谢谢你是对的。在我的示例中,数据[i]和路径[j,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]