#r #apply
Вопрос:
У меня есть список с десятью матрицами 5×5, и я хотел бы получить максимум каждого столбца в каждой матрице. Пример моего списка приведен ниже:
My List:
[[1]]
A B C D E
[1,] 30 40 60 12 7
[2,] 14 30 50 25 2
[3,] 53 1 50 54 50
[4,] 61 200 50 33 7
[5,] 73 88 50 33 8
.....
[[10]]
A B C D E
[1,] 2 40 60 6 7
[2,] 6 30 2 25 2
[3,] 9 1 40 54 50
[4,] 55 2 80 1 100
[5,] 20 88 1 200 8
Результат, который мне нужен, это:
Мой список показывает максимум в каждом столбце каждой матрицы, и в списке результатов будет десять матриц 1х5:
[[1]]
A B C D E
[1,] 73 200 60 54 50
.....
[[10]]
A B C D E
[1,] 55 88 80 200 100
Я использовал apply, но я знаю, что мне чего-то не хватает, чтобы сказать ему, чтобы он проходил через каждый столбец каждой матрицы..
apply(My List, 2, max, na.rm = TRUE)
Сообщение об ошибке, которое я получил, было:
dim(X) должен иметь положительную длину
Ответ №1:
Нам нужно lapply
с apply
, т. е. зациклиться на list
с lapply
, затем зациклиться на столбцах ( MARGIN = 2
) matrix
внутри каждого list
с apply
lapply(MyList, function(x) apply(x, MARGIN = 2,
FUN = max, na.rm = TRUE))
-выход
[[1]]
A B C D E
73 200 60 54 50
[[2]]
A B C D E
55 88 80 100 100
Или использовать colMaxs
с matrixStats
library(matrixStats)
lapply(MyList, colMaxs, na.rm = TRUE)
[[1]]
[1] 73 200 60 54 50
[[2]]
[1] 55 88 80 100 100
данные
MyList <- list(structure(c(30, 14, 53, 61, 73, 40, 30, 1, 200, 88, 60,
50, 50, 50, 50, 12, 25, 54, 33, 33, 7, 2, 50, 7, 8), .Dim = c(5L,
5L), .Dimnames = list(NULL, c("A", "B", "C", "D", "E"))), structure(c(2,
6, 9, 55, 20, 40, 30, 1, 2, 88, 60, 2, 40, 80, 1, 6, 25, 54,
1, 100, 7, 2, 50, 100, 8), .Dim = c(5L, 5L), .Dimnames = list(
NULL, c("A", "B", "C", "D", "E"))))
Комментарии:
1. Привет @akrun, спасибо вам за два предоставленных решения. Я попробовал первое решение, и оно сработало! Однако, когда я попробовал второе решение, оно вернуло сообщение об ошибке: «Ошибка в FUN(X[[i]], …) : аргумент» x «должен быть матрицей или вектором».
2. @HongH378 Я предположил, что в вашем списке есть элементы в виде матриц, как вы упомянули
5 x 5 matrices
. Если это data.frame, вам нужно преобразоватьmatrix
его в т. е.lapply(MyList, function(x) colMaxs(x, na.rm = TRUE))
3. Спасибо, я попробовал ваше решение, и оно сработало! — Это сообщение должно показать другим пользователям, что второе решение тоже работает 🙂