You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用R语言apply函数计算矩阵行比例时结果异常的技术咨询

解决apply计算转移概率时的索引错位问题

嘿,我来帮你排查这个问题!你遇到的tmp1[4,7]显示为1的情况,其实是apply函数的返回格式导致的索引错位,不是你的逻辑有问题~

问题原因分析

当你使用apply(tmp, 1, ...)按行处理矩阵时,apply会把每一行的计算结果作为拼接到最终的矩阵里。也就是说,你原本期望的“每行比例对应原矩阵的行”,实际上被转置了:

  • tmp的第7行是[0,0,0,3,0,0,0,0],sum为3,计算后得到的向量是[0,0,0,1,0,0,0,0]
  • 这个向量被作为tmp1的第7列,所以tmp1的第4行第7列就对应了这个向量的第4个元素——也就是1,这和你预期的“原tmp[4,7]的比例”完全不是一回事!

两种解决方案

方案1:转置apply的结果

直接对apply的输出做转置,让行和列对应回原矩阵的逻辑:

tmp1 <- t(apply(tmp, 1, function(X){
  if (sum(X) != 0) {
    X / sum(X)
  } else {
    numeric(length(X))
  }
}))

方案2:用rowSums更简洁实现

避开apply的转置问题,直接用行和计算比例,代码更简洁:

# 先计算每行的总和
row_totals <- rowSums(tmp)
# 计算比例,行和为0时会得到NaN,后续替换为0
tmp1 <- tmp / row_totals
tmp1[is.na(tmp1)] <- 0

验证结果

处理后,tmp1的第4行对应原tmp的第4行([0,0,0,20,0,0,0,0]),sum为20,所以第4行的第4个元素是1,其余都是0,tmp1[4,7]自然就是0,符合你的预期啦!

内容的提问来源于stack exchange,提问作者Qing Guan

火山引擎 最新活动