【问题标题】:Apply function to all columns in matrix using column means使用列均值将函数应用于矩阵中的所有列
【发布时间】:2018-07-03 08:49:45
【问题描述】:

我有一个矩阵 m(由三列组成,每列由整数组成,平均值分别为 5、10 和 15):

m <- round(matrix(data=cbind(rnorm(30, 5), rnorm(30, 10), rnorm(30, 15)), nrow=30, ncol=3), 0)

现在,我想要一个与 m 维度相同的矩阵,其中每个值 x 计算为 x 减去找到 x 的列的平均值。如何才能做到这一点?我尝试过应用各种应用函数(具体来说,我一直在查看user3640617User60 提出的两个问题),但问题似乎是我不能在@ 中使用行的平均值作为参数987654324@、lapplyvapply...

例子:如果head(m)

     [,1] [,2] [,3]
[1,]    6   11   14
[2,]    6    8   16
[3,]    6   11   15
[4,]    6   10   17
[5,]    5    9   15
[6,]    3   10   15

我想得到

     [,1] [,2] [,3]
[1,]    1    1   -1
[2,]    1   -2    1
[3,]    1    1    0
[4,]    1    0    2
[5,]    0   -1    0
[6,]   -2    0    0

【问题讨论】:

    标签: r apply lapply sapply


    【解决方案1】:

    一种方法是使用apply(m, 2, function(x)(x-mean(x)))

    另一种方法是使用t(t(m)-colMeans(m))

    【讨论】:

    • 仅适用于初学者(如我):复制粘贴变量将是 apply(m, 2, function(x)(x-mean(x)))
    • 感谢您的建议,下次我会更加小心。享受您的 R 学习!
    • 请注意,在 200x50 矩阵的基准测试中,使用 colMeans 的矢量化解决方案比 apply 快约 200 倍。始终尝试在 R 中使用矢量化操作!
    • 是的,所以我添加了一个矢量化解决方案。我发布“申请”是因为他要求提供“申请”解决方案。顺便说一句,在使用矢量化操作时更改广播方向有什么建议吗? (我讨厌将矩阵转置两次)
    • @VicaYang 我不想批评你的回答,我只是想向 Lukas 指出矢量化解决方案要快得多:)
    【解决方案2】:

    你正在寻找

    scale(m,center=T,scale=F)[,]
    

    另一种方法是

    sweep(m,2,colMeans(m)) 
    

    但没有scale那么快

    【讨论】:

      猜你喜欢
      • 2021-09-13
      • 1970-01-01
      • 2019-05-13
      • 1970-01-01
      • 1970-01-01
      • 2015-05-08
      • 2015-02-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多