我有一个具有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_max
和a_min
,b_max
和b_min
之间的差的乘积,以及对所有成对的列都如此。
在上面的示例中,最终产品是:
(0.9-0.2)*(0.7-0.3)*(0.6-0.5) = 0.028.
如何对一般的2N
列和P
行进行矢量处理?
答案 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)