为何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
相关产品推荐
相关产品推荐

