在r中应用函数太慢

在r中应用函数太慢,r,loops,apply,R,Loops,Apply,我必须为许多物种计算每行的特定公式。该公式是丰度值与数据框最后一行中的值之间的乘积。然后,对所有这些产品进行了总结 我当前的脚本包括使用一个apply函数,该函数看起来和我开始使用的for循环一样慢。 我在下面的脚本中简化了这个问题,使用了一个名为az的简单df: az=data.frame(c(1,2,10),c(2,4,20),c(3,6,30)) colnames(az)=c("a","b","c") # Initial for loop prov=0 # prov for provi

我必须为许多物种计算每行的特定公式。该公式是丰度值与数据框最后一行中的值之间的乘积。然后,对所有这些产品进行了总结

我当前的脚本包括使用一个apply函数,该函数看起来和我开始使用的for循环一样慢。 我在下面的脚本中简化了这个问题,使用了一个名为
az
的简单df:

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


# 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]
            }
        print(prov)
        prov=0
        }

# Apply solution
apply(az[,], 1, function(x) {sum(x*az[nrow(az),], na.rm=TRUE)})
这两种解决方案都有效,但它们非常慢(使用我最初的df),我必须对大量物种重复操作。 因此,我想知道是否有人有更有效的解决方案,也许是使用矢量化表达式

亲切的问候

试试看

  rowSums(az*unlist(az[nrow(az),])[col(az)], na.rm=TRUE)
或者使用
rep

  rowSums(az*rep(unlist(az[nrow(az),]),each=ncol(az)), na.rm=TRUE)

最快的解决方案可能是矩阵代数:

apply(az[,], 1, function(x) {sum(x*az[nrow(az),], na.rm=TRUE)})
#[1]  140  280 1400

m <- as.matrix(az)
m[is.na(m)] <- 0 #remove NA from sums
as.vector(m %*% m[nrow(m),])
#[1]  140  280 1400
apply(az[,],1,函数(x){sum(x*az[nrow(az),],na.rm=TRUE)}
#[1]  140  280 1400

m
tcrossprod
可能比.vector(tcrossprod(m[nrow(m),],m))快一点
@akrun一般来说是的,但我不太确定它在一个因素只是一个向量的特定情况下是否有好处。我为您准备了一个最难的(但我无法编辑我的初始帖子)。在for循环的首字母中,我不必执行
prov=prov+az[i,j]*az[nrow(az),j]
,而必须执行
prov=prov+az[i,j]*(az[nrow(az),j-m[])^2]
m[]我们在最初的帖子中每行得到的结果。这实际上是一个方差计算(第一个对应于平均值)。我够清楚了吗?请问一个新问题。好的,这是链接:[非常感谢你的回答。不过矩阵代数的版本要快一点。@user3443183没问题。我也会问矩阵代数