r - 具有动态列输入的列乘积 - 向量化操作
问题描述
我想将以下代码矢量化以进行更有效的处理。我需要逐行获取列的乘积(即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
上述两种方法都会产生相同的“计算”列。我只需要一种更有效的方式来生成此列。
解决方案
一种选择是将上面的三角形元素转换为NA
,然后使用rowProds
frommatrixStats
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
推荐阅读
- tensorflow - 使用 Keras、Tensorflow 进行多变量、多步 LSTM 时间序列预测
- xslt - 如何使用 for-each-group by 在 XSLT 2.0 中对值进行分组
- python - 来自熊猫数据框嵌套字典的熊猫数据框
- javascript - 将组件添加到具有组件的 JSON 字符串
- c# - 如何在 Angular 中捕获 ActionResult Api 响应?
- multidimensional-array - Fortran90 从数据文件中读取和填充数组
- ios - 如何解决这个问题在 Xcode 上找不到模块“image_picker”?
- c# - C# - 将对象列表转换为包含多个对象属性的数组
- javascript - 如何在 javascript 中创建新的列表元素而不为每个新项目创建新的 ul 元素
- typescript - 定义类时,属性确实存在于类型上