You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 17:40:22