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

为何R中对矩阵按行和列应用mean函数得到原矩阵?

为什么apply(m, c(1,2), mean)返回和原矩阵一致的结果?

嘿,这个问题其实是对apply()函数的margin参数有点小误解,我来给你理清楚~

首先先回顾你的代码和结果:
你创建的矩阵:

m <- matrix(c(1,2,3,4), nrow = 2)
m
#      [,1] [,2]
# [1,]    1    3
# [2,]    2    4

然后执行apply(m, c(1,2), mean),得到了和原矩阵一模一样的输出,这看起来有点反直觉对吧?

核心原因:margin=c(1,2)是对每个单个元素处理

咱们先明确apply()的margin参数到底干啥:

  • margin=1:按行处理,把每一行作为一个完整的向量传入函数;
  • margin=2:按列处理,把每一列作为一个完整的向量传入函数;
  • margin=c(1,2):并不是“同时按行和列处理整个矩阵”,而是遍历矩阵的每一个(row, column)位置,把该位置的单个元素作为输入传递给你指定的函数。

那你用的函数是mean——对单个数值求均值,结果当然就是这个数值本身啊!所以整个输出矩阵自然和原矩阵完全一致。

举个例子验证

咱们换个函数试试就能明白:
比如用sum代替mean:

apply(m, c(1,2), sum)

结果还是和原矩阵一样,因为单个元素的求和结果就是它自己。

再换个需要处理多个值的函数,比如range(返回最小值和最大值):

apply(m, c(1,2), range)
#      [,1] [,2]
# [1,]    1    3
# [2,]    1    3
# [3,]    2    4
# [4,]    2    4

你看,每个元素被单独处理后,返回了包含两个相同值的向量(因为单个元素的最小和最大值都是它自己),输出的维度也变成了4行2列,这也能佐证margin=c(1,2)是逐个处理元素的逻辑。

总结

margin=c(1,2)的本质是遍历矩阵的每一个独立元素,将单个元素作为函数输入。当你用的函数(比如mean、sum)对单个数值的输出就是数值本身时,结果自然和原矩阵一致啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:36:59