найдите максимальное значение в списке векторов в R

#r #list

#r #Список

Вопрос:

У меня есть список, который содержит векторы длиной 2, первый элемент вектора обозначает один тип данных, а второй — второй тип данных

 [[1]]
[1] "51224.99" "0.879"   

[[2]]
[1] "51224.50" "0.038"   

[[3]]
[1] "51224.00" "0.038"   

[[4]]
[1] "51223.50" "0.038"   

[[5]]
[1] "51223.00" "0.062"   

[[6]]
[1] "51222.50" "0.038"   

[[7]]
[1] "51222.00" "0.038"   

[[8]]
[1] "51221.86" "0.370"   

[[9]]
[1] "51221.82" "0.015"   

[[10]]
[1] "51221.50" "0.038"   

[[11]]
[1] "51221.44" "2.100"   

[[12]]
[1] "51221.39" "0.196"   

[[13]]
[1] "51221.00" "0.038"   

[[14]]
[1] "51220.50" "0.038"   

[[15]]
[1] "51220.19" "0.292"   

[[16]]
[1] "51220.00" "0.038"   

[[17]]
[1] "51219.97" "0.012"   

[[18]]
[1] "51219.62" "0.684"   

[[19]]
[1] "51219.50" "0.038"   

[[20]]
[1] "51219.02" "2.311"   
 

Мне нужно найти максимальное значение по второму элементу вектора. То есть в конечном результате я должен получить следующий результат:

 [1] "51219.02" "2.311" 
 

поскольку максимальное второе число в векторах равно 2.311

Ответ №1:

Предполагая, что ваш список вызван yourList , вы можете выполнить следующее:

 secondValuesNumeric <- as.numeric(sapply(yourList,"[[",2))
maxIndex <- which.max(secondValuesNumeric)
result <- yourList[[maxIndex]]
 

Ответ №2:

Вы могли бы просто превратить его в dataframe! Вот как я бы это сделал:

(сначала я создаю примерный список, чтобы имитировать ваш):

 ex <- purrr::map(seq(12), function(i) c(rnorm(1), rnorm(1)))
 

Затем вы можете использовать purrr, чтобы превратить его в фрейм данных, и filter для фильтрации туда, где второе значение является максимальным для этого столбца:

 purrr::map_df(ex, function(x) data.frame(val1 = x[1], val2 = x[2])) %>%
  dplyr::filter(val2 == max(val2))
 

Вы должны быть в состоянии использовать этот пример ^, заменив ex на имя вашего списка.

Ответ №3:

Вот вариант с rbind извлечением второго столбца, преобразованием в числовой, поиском максимального индекса для подмножества list

 lst1[which.max(as.numeric(do.call(rbind, lst1)[,2]))]
 

Комментарии:

1. в моем конкретном случае я хотел бы избежать дополнительных преобразований, лучше все делать в одном формате