Нахождение максимального значения в столбцах матриц в списке

#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. Спасибо, я попробовал ваше решение, и оно сработало! — Это сообщение должно показать другим пользователям, что второе решение тоже работает 🙂