Это, вероятно, легче решить с помощью массива, а не списка, поскольку у R есть встроенные, векторизованные подходы к этой проблеме.
Чтобы получить массив из .list
, unlist его и поставить соответствующие размеры (которые могут быть автоматизированы путем поиска dim()
из .list[[1]]
и length(.list)
:
arr <- array(unlist(.list), dim = c(5,5,2))
Затем получают желаемый результат с помощью rowMeans()
(! да, действительно)
rowMeans(arr, dim = 2)
R> rowMeans(arr, dim = 2)
[,1] [,2] [,3] [,4] [,5]
[1,] 6 11 16 21 26
[2,] 7 12 17 22 27
[3,] 8 13 18 23 28
[4,] 9 14 19 24 29
[5,] 10 15 20 25 30
na.rm
аргумент обрабатывает NA
случай тоже:
R> rowMeans(arr, dim = 2, na.rm = TRUE)
[,1] [,2] [,3] [,4] [,5]
[1,] 6 11 16 21 26
[2,] 7 12 17 22 27
[3,] 8 13 18 23 28
[4,] 9 14 19 24 29
[5,] 10 15 20 25 30
Более медленный способ заключается в использовании apply()
, который может быть более поучительным относительно того, что rowMeans()
делает:
R> apply(arr, 1:2, mean, na.rm = TRUE)
[,1] [,2] [,3] [,4] [,5]
[1,] 6 11 16 21 26
[2,] 7 12 17 22 27
[3,] 8 13 18 23 28
[4,] 9 14 19 24 29
[5,] 10 15 20 25 30
т.е. применяя среднюю функцию, группируя данные по строкам и столбцам размеров. Подумайте о массиве как о коробке, причем высота окна будет третьим измерением. Эта коробка состоит из маленьких кубов, таких как рубиновый куб. Мы хотим, чтобы среднее количество маленьких кубов было сложено над каждой комбинацией строк и столбцов; среднее количество маленьких кубов, уложенных выше (1,1) и т. д. Это то, что делают функции apply()
и rowMeans()
, если вы обрабатываете множество матриц в списке как массив.
Ну, ваш ответ велик, спасибо.Однако я нашел способ сделать это, используя «Уменьшить» (см. Мой собственный ответ). Кажется, это правильно, не так ли? – Mayou
Да, да, +1. Извините меня, почему я ем свои слова ... –