Найти максимальные значения переменной в списке - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть список следующей структуры, и я намерен найти максимальное значение X2 во второй переменной (b) в списке

пример данных

[[1]]

[[1]]$a

[1] 2

[[1]]$b

   X1  X2
1  58 1686729

2 106 1682303


[[2]]

[[2]]$a

[1] 3

[[2]]$b

   X1  X2

1  24 1642468

2  89 1695581

3 156 1634019

Я просмотрел несколько фильтров, которые можно применить к списку, например:

library(rlist)
list.filter(result, max(b$area))

, а также попытался lapply, но безуспешно

lapply(result, function(x) x[which.max(x$b)])

Мне нужно следующеевывод:

a      x1    x2
2      58   1686729
3      89   1695581   

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Вы также можете использовать sapply():

t(sapply(list, function(elem){
  c(a = elem$a, elem$b[which.max(elem$b$area), ])
}))
0 голосов
/ 01 февраля 2019

С помощью lapply() вы можете найти максимум X2 в $b в каждом списке, затем cbind() с элементом a.

l_max <- lapply(l, function(x) {
  b <- x$b
  cbind(a=x$a, b[which.max(b$X2),])
})

Использовать bind_rows() из dplyr для связывания.

l_max %>% 
  dplyr::bind_rows()
#     a X1      X2
# 1   2 58 1686729
# 2   3 89 1695581

Пример данных:

l <- list(
  list(a = 2, 
       b = data.frame(X1 = c(58, 106),  X2 = c(1686729, 1682303))),
  list(a = 3, 
       b = data.frame(X1 = c(24, 89,156),  X2 = c(1642468, 1695581,1634019)))
)

На вашем примере:

l_max <- lapply(l, function(x) {
  b <- x$b
  cbind(a = x$a, b[which.max(b[,2]),]) # NOTICE I used [,2] to refer to the second column
                             #b$area works too if all df share the col name
})

l_max %>% 
  dplyr::bind_rows()
#   a  rt    area
# 1 2  58 1686729
# 2 3  89 1695581
# 3 4 101 1679889
# 4 5  88 1695983
# 5 6 105 1706445
# 6 7 121 1702019

Другое решение с purrr::map_df() избегает использования bind_rows():

purrr::map_df(l, function(x) {
  b <- x$b
  cbind(a = x$a, b[which.max(b[,2]),]) 
})

Вся база R использует mapply():

t(mapply(function(x) {
  b <- x$b
  cbind(a = x$a, b[which.max(b[,2]),]) 
}, l))

Или с Map():

do.call("rbind", Map(function(x) {
  b <- x$b
  cbind(a = x$a, b[which.max(b[,2]),]) 
}, l))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...