首页 > 解决方案 > 具有动态列输入的列乘积 - 向量化操作

问题描述

我想将以下代码矢量化以进行更有效的处理。我需要逐行获取列的乘积(即rowProds),但是我想要乘积的列数需要是另一个输入的函数。

如果可能的话,我希望使用 Base R 来完成,但我愿意接受并感谢任何建议。

这可以很容易地使用循环或使用 udf 应用系列来完成,但这些速度不足以满足我的需求。

# Generate some data

mat <- data.frame(X = 1:5)
for (i in 1:5) {
  set.seed(i)
  mat[1 + i] <- runif(5)
}

# Via a for loop

for (i in 1:nrow(mat)) {  
  mat$calc[i] <- prod(mat[match(mat$X[i], mat$X), 2:(i + 1)])
}
mat

# Via a function with mapply

rowprodfun <- function(X) {  
  myprod <- prod(mat[match(X, mat$X), 2:(X + 1)])
  return(myprod)
}

mat$calc <- mapply(rowprodfun, mat$X)
mat

mat$calc
# [1] 0.265508663 0.261370165 0.126427355 0.013874517 0.009758232

上述两种方法都会产生相同的“计算”列。我只需要一种更有效的方式来生成此列。

标签: r

解决方案


一种选择是将上面的三角形元素转换为NA,然后使用rowProdsfrommatrixStats

library(matrixStats)
rowProds(as.matrix(mat[-1] * NA^upper.tri(mat[-1])), na.rm = TRUE)
#[1] 0.265508663 0.261370165 0.126427355 0.013874517 0.009758232

推荐阅读