向量计算特定列的乘积

时间:2018-12-14 12:33:06

标签: r vectorization

我有一个具有2种列名的矩阵:以“ min”结尾的列名和以“ max”结尾的列名。 例如,此矩阵的第一行和前6列可以是:

M = matrix(c(0.2, 0.3, 0.5, 0.9, 0.7, 0.6), nrow = 1, ncol = 6)
colnames(M) = c("a_min", "b_min", "c_min", "a_max", "b_max", "c_max")

我想为M的每一行计算a_maxa_minb_maxb_min之间的差的乘积,以及对所有成对的列都如此。

在上面的示例中,最终产品是:

(0.9-0.2)*(0.7-0.3)*(0.6-0.5) = 0.028.

如何对一般的2N列和P行进行矢量处理?

2 个答案:

答案 0 :(得分:2)

这是一个基于R的想法,

Reduce(`*`, lapply(split.default(M, sub('_.*', '', colnames(M))), diff))
#[1] 0.028

如果您有多行,即M <- rbind(M, M)

Reduce(`*`, lapply(split.default(as.data.frame(M), sub('_.*', '', colnames(M))), 
                                                             function(i) abs(i[1] - i[2])))
#  a_min
#1 0.028
#2 0.028

答案 1 :(得分:2)

要计算max - min的差异,只需减去矩阵,例如

D <- M[, grep('_max', colnames(M))] - M[, grep('_min', colnames(M))]

(您必须检查列的顺序是否正确,否则将计算出错误的差值)。

这将为您提供差异矩阵,现在您要计算行积。您可以例如使用循环或apply,但使用rowProds软件包中的matrixstats更快

matrixStats::rowProds(D)