r - 在 r 中应用函数太慢

标签 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 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)

关于r - 在 r 中应用函数太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29125609/

相关文章:

pandas - 将数字上限/阈值应用于 pandas 数据框

r - 为图例添加颜色

r - 无法在 ArcGIS 中打开通过 R 生成的大型 (3Gb) gri 栅格图层

vba - 循环遍历结合路径和名称的工作簿

javascript - 在 ES6 javascript 中检测 FOR OF 循环中的最后一次迭代

java - 如何跳过 for each 循环中的第一次迭代?

r - 从多个 Rmd 文件缓存 knit 外部代码

r - 组合 geom_tile() 和 facet_grid/facet_wrap 并删除图 block 之间的空间 (ggplot2)

flash - 我可以在构造函数中使用apply()来传递任意数量的参数

python - 当我们使用自定义函数对 groupby 结果应用时,不会传递所有列