代码之家  ›  专栏  ›  技术社区  ›  Lmm

如何有效地在多个矩阵上应用函数-列的平均值

  •  1
  • Lmm  · 技术社区  · 6 年前

    因此,我对处理矩阵和函数是一个新手,我正在尝试解决如何应用一个函数来计算多个矩阵的列平均值。

    这里有一些虚拟的集市:

    A <- matrix(c(1,2,3,4,5,6,7,8,9),nrow=3)
    B <- matrix(c(9,8,7,6,5,4,3,2,1),nrow=3)
    

    我有13个大矩阵,所有的变量都不同,但是它们都有相同的维度。我想得到每个矩阵的列的平均值。我已经为一个单独的矩阵解决了这个问题:

    AA <- sapply(1:3, function(x) mean(A [,x], na.rm = TRUE))
    

    但是,有一种更有效的方法可以将它应用到我所有的矩阵中,而不是将它写出十几次,然后得到单独的输出,即每个矩阵的列表示法?我看过一些使用矩阵列表的工作——这是正确的路线吗?抱歉,如果这是重复的,我试图找到一个明确的例子,正确的答案无效(请随时指出我的正确方向)。

    2 回复  |  直到 6 年前
        1
  •  1
  •   akrun    6 年前

    我们把矩阵保存在 list 使用 vapply 循环通过 列表 得到 colMeans

    vapply(list(A, B), colMeans, numeric(3))
    #      [,1] [,2]
    #[1,]    2    8
    #[2,]    5    5
    #[3,]    8    2
    

    或与 aggregate

    aggregate(do.call(rbind, list(A, B)), list(rep(1:2, each = 3)), FUN = mean)
    

    或使用 tidyverse

    library(tidyverse)
    list(A, B) %>%
          map(~ .x %>%
                  as.data.frame %>%
                   summarise_all(mean))
    #[[1]]
    #  V1 V2 V3
    #1  2  5  8
    
    #[[2]]
    #  V1 V2 V3
    #1  8  5  2
    

    tidyverse的方式可以用于不同的目的。也可以是分组操作

    list(A, B) %>%
        map_df(as.data.frame, .id = 'grp') %>%
        group_by(grp) %>%
        summarise_all(mean)
    # A tibble: 2 x 4
    #  grp      V1    V2    V3
    #  <chr> <dbl> <dbl> <dbl>
    #1 1         2     5     8
    #2 2         8     5     2
    
        2
  •  1
  •   markus    6 年前

    创建列表然后应用 colMeans 到列表中的每个元素

    lst <- list(A, B)
    lapply(lst, colMeans)
    #[[1]]
    #[1] 2 5 8
    
    #[[2]]
    #[1] 8 5 2
    

    我看过一些使用矩阵列表的工作——这是正确的路线吗?

    是的,我想说这是对你所要达到的目标的推荐。