С помощью 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))