优化方差计算,因为循环太慢

时间:2015-03-18 17:11:25

标签: r for-loop

以下是此链接[Apply function too slow in r

所回答问题的下一步

我必须为很多物种计算每行特定的配方。公式对应于方差计算,因此需要在上面的链接中获得的结果。

我当前的脚本包括使用一个自然非常慢的for循环。我使用名为az的简单df简化了以下脚本中的问题。

az=data.frame(c(1,2,10),c(2,4,20),c(3,6,30))
colnames(az)=c("a","b","c")

# Necessary number calculated in step 1 (see link above)
m <- as.matrix(az)
m[is.na(m)] <- 0 #remove NA from sums
step1 = as.vector(m %*% m[nrow(m),])

# Initial for loop
prov=0 # prov for provisional number
    for (i in 1:nrow(az)){
            for (j in 1:ncol(az)){
                   prov=prov+az[i,j]*az[nrow(az),j]
                   prov=prov+az[i,j]*(az[nrow(az),j]-step1[i])^2
            }
        print(prov)
        prov=0
        }

由于我必须重复大量物种的操作,我想知道是否有人有更有效的解决方案,可能使用矢量化表达。

亲切的问候。

1 个答案:

答案 0 :(得分:0)

此代码将返回代码打印出的相同值,但效率更高。

> n<-nrow(m)
> mm<-t(m)
> prov<-mm*mm[,n]
> prov<-prov+mm*(mm[,n]-step1[col(mm)])^2
> colSums(prov)
[1]     82140    791480 113717400
相关问题