Как эффективно применить функцию к ряду матриц - среднее значение столбцов - PullRequest
0 голосов
/ 12 декабря 2018

Итак, я новичок в работе с матрицами и функциями, и я пытаюсь понять, как применить функцию для вычисления средних по столбцам для нескольких матриц.

Вот несколько фиктивных выражений:

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 ]

0 голосов
/ 12 декабря 2018

Создайте список и затем примените colMeans к каждому элементу в этом списке

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

#[[2]]
#[1] 8 5 2

Я видел некоторую работу с использованием списков матриц - это правильный путь?

Да, я бы сказал, что это рекомендуется для того, чего вы пытаетесь достичь.

0 голосов
/ 12 декабря 2018

Мы сохраняем матрицы в 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

Тидверсив может быть соединен в цепочку для различных целей.Это также может быть группа по операции

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
...