如何有效地将函数应用于多个矩阵 - 列的平均值
How to efficiently apply a function on a number of matrices - mean of columns
所以我是使用矩阵和函数的新手,我正在尝试研究如何应用一个函数来计算多个矩阵的列均值。
这是一些虚拟矩阵:
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))
但可能有一种更有效的方法将其应用于我的所有矩阵,而不是将其写出十几次并获得单独的输出,即分别为每个矩阵的列均值?我已经看到一些使用矩阵列表的工作——这是正确的方法吗?抱歉,如果这是重复的,我试图找到一个正确答案的明确示例但无济于事(请随时为我指明正确的方向)。
我们将矩阵保存在list
中,使用vapply
遍历list
得到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 方法可以链接起来用于不同的目的。也可以是group by operation
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
创建一个列表,然后将 colMeans
应用于该列表中的每个元素
lst <- list(A, B)
lapply(lst, colMeans)
#[[1]]
#[1] 2 5 8
#[[2]]
#[1] 8 5 2
I have seen some work with using lists of matrices - is this the correct route to go?
是的,我会说这是针对您要实现的目标的推荐。
所以我是使用矩阵和函数的新手,我正在尝试研究如何应用一个函数来计算多个矩阵的列均值。
这是一些虚拟矩阵:
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))
但可能有一种更有效的方法将其应用于我的所有矩阵,而不是将其写出十几次并获得单独的输出,即分别为每个矩阵的列均值?我已经看到一些使用矩阵列表的工作——这是正确的方法吗?抱歉,如果这是重复的,我试图找到一个正确答案的明确示例但无济于事(请随时为我指明正确的方向)。
我们将矩阵保存在list
中,使用vapply
遍历list
得到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 方法可以链接起来用于不同的目的。也可以是group by operation
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
创建一个列表,然后将 colMeans
应用于该列表中的每个元素
lst <- list(A, B)
lapply(lst, colMeans)
#[[1]]
#[1] 2 5 8
#[[2]]
#[1] 8 5 2
I have seen some work with using lists of matrices - is this the correct route to go?
是的,我会说这是针对您要实现的目标的推荐。