R语言矩阵列排序后部分列均值/求和异常,求原因
问题排查:矩阵列排序后均值/求和异常的原因
问题描述
对矩阵列按绝对值大小排序后绘制列累积和,结果不符合预期;更关键的是排序后部分列均值变化,且colSums(toad)/4000与colMeans(toad)出现不一致。复现代码如下:
df.exercise = .2 set.seed(78455823) toad = matrix(rt(1000 * 4000, df.exercise), ncol = 1000) for(i in 1:1000){ toad.sort[, i] = toad[order(abs(toad[, i])), i] } which(colMeans(toad) != colMeans(toad.sort)) which(colSums(toad) != colSums(toad.sort)) loop.sums = loop.sums.sort = numeric(1000) for(i in 1:1000){ loop.sums.sort[i] = sum(toad.sort[, i]) loop.sums[i] = sum(toad[, i]) } which(loop.sums.sort != loop.sums) which(loop.sums.sort != colSums(toad.sort)) which(loop.sums != colSums(toad))
异常原因分析
1. 核心问题:toad.sort未提前初始化
代码中直接对toad.sort[, i]赋值,但从未创建这个矩阵对象。在R中,未定义的对象默认是NULL,循环赋值时会动态扩展结构,这个过程会导致数据类型隐式转换——原本的数值型矩阵被转换成了非数值结构(比如列表),后续的colMeans、colSums等函数计算逻辑被打乱,自然出现结果异常。
修复方法:在循环前先初始化toad.sort为与toad同维度、同类型的矩阵:
toad.sort = matrix(nrow = nrow(toad), ncol = ncol(toad))
2. 次要问题:浮点数精度导致的“假不等”
即使修复了初始化问题,用!=直接比较浮点数是否相等也会出现误判。因为浮点数在计算机中是近似存储的,求和、求均值的计算过程中可能产生微小的精度偏差,导致colSums(toad)/4000和colMeans(toad)看起来“不等”,但实际是精度误差。
正确的比较方式应该使用all.equal()函数,它会忽略微小的浮点数差异:
which(!all.equal(colMeans(toad), colMeans(toad.sort))) which(!all.equal(colSums(toad), colSums(toad.sort)))
内容的提问来源于stack exchange,提问作者Vonvorv
相关产品推荐
相关产品推荐

