RStudio数组操作:特定行列组合比值计算问题求助
R矩阵按行列规则计算的解决方案
首先定义示例矩阵:
marray_1 <- matrix(c(17, 8, 1, 27, 0, 16, 11, 32, 0, 0, 13, 66), nrow = 3, ncol = 4)
计算规则
对于结果矩阵的第i行第j列元素:
- 分子:原矩阵第
j列的总和 - 分母:原矩阵中从第
i行到最后一行,每行从第j列到最后一列的和,再将这些行的和累加起来
对应示例中的计算逻辑:
- 第1行第1列:
17/(17+8+1+27) - 第2行第2列:
(8+16)/((16+11+32)+(8+1+27)) - 第3行第3列:
(1+11+13)/((1+27)+(11+32)+(13+66))
问题分析
你原代码的分母只计算了第i行从j列到末尾的和,没有累加从i行到最后一行的所有对应行和,这是核心错误。
可扩展代码实现
方式1:循环实现(贴近你的原始思路)
marray_1 <- matrix(c(17, 8, 1, 27, 0, 16, 11, 32, 0, 0, 13, 66), nrow = 3, ncol = 4) rows <- nrow(marray_1) cols <- ncol(marray_1) # 初始化结果矩阵 result <- matrix(NA, nrow = rows, ncol = cols) for (j in 1:cols) { # 先计算当前列j开始,每行到末尾的和 row_sums <- rowSums(marray_1[, j:cols, drop = FALSE]) for (i in 1:rows) { # 分母是从第i行到最后一行的row_sums总和 denominator <- sum(row_sums[i:rows]) # 分子是第j列的总和 numerator <- colSums(marray_1)[j] result[i, j] <- numerator / denominator } } # 输出结果 print(result)
方式2:向量化实现(更高效,适合大矩阵)
marray_1 <- matrix(c(17, 8, 1, 27, 0, 16, 11, 32, 0, 0, 13, 66), nrow = 3, ncol = 4) rows <- nrow(marray_1) cols <- ncol(marray_1) # 预计算每个列j对应的每行从j到末尾的和 row_sums_list <- lapply(1:cols, function(j) rowSums(marray_1[, j:cols, drop = FALSE])) # 构建分母矩阵:每个(i,j)位置的值是row_sums_list[[j]]从i到rows的和 denominator_matrix <- sapply(1:cols, function(j) sapply(1:rows, function(i) sum(row_sums_list[[j]][i:rows]))) # 构建分子矩阵:每列重复对应列的总和 numerator_matrix <- matrix(rep(colSums(marray_1), each = rows), nrow = rows) # 计算结果矩阵 result <- numerator_matrix / denominator_matrix # 输出结果 print(result)
结果验证
运行代码后,结果矩阵对应位置的值会匹配你给出的示例计算:
- 第1行第1列:≈0.3208
- 第2行第2列:≈0.2087
- 第3行第3列:≈0.1667
内容的提问来源于stack exchange,提问作者ariggs154
相关产品推荐
相关产品推荐

