Как применить функцию к более чем одному списку списков в r? - PullRequest
3 голосов
/ 08 апреля 2020

У меня есть данные, которые содержат список списков. И я хочу найти Макс. значения каждого типа данных двойного типа, как показано на рисунке; ​​

output

Вот структура моих данных;

list(`Cluster 1` = list(Day_1 = list(structure(c(`1` = 0, `2` = 0, 
    `3` = 0, `4` = 0, `5` = 0, `6` = 0, `7` = 0, `8` = 0, `9` = 0.041, 
    `10` = 0.673, `11` = 0, `12` = 0.766), .Dim = 12L, .Dimnames = list(
        c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", 
        "12"))), structure(c(`1` = 0, `2` = 0, `3` = 0, `4` = 0, 
    `5` = 0, `6` = 0.041, `7` = 0.673, `8` = 0.766), .Dim = 8L, .Dimnames = list(
        c("1", "2", "3", "4", "5", "6", "7", "8")))), Day_2 = list(
        structure(c(`1` = 1.07, `2` = 0, `3` = 1.27, `4` = 0.19, 
        `5` = 0, `6` = 0, `7` = 0, `8` = 0, `9` = 0, `10` = 0, `11` = 0, 
        `12` = 0), .Dim = 12L, .Dimnames = list(c("1", "2", "3", 
        "4", "5", "6", "7", "8", "9", "10", "11", "12"))), structure(c(`1` = 1.07, 
        `2` = 1.27, `3` = 0.19, `4` = 0, `5` = 0, `6` = 0, `7` = 0, 
        `8` = 0), .Dim = 8L, .Dimnames = list(c("1", "2", "3", "4", 
        "5", "6", "7", "8"))))), `Cluster 2` = list(Day_3 = list(
        structure(c(`1` = 0, `2` = 0, `3` = 0, `4` = 0, `5` = 0, 
        `6` = 0, `7` = 0, `8` = 0, `9` = 0.19, `10` = 0, `11` = 0, 
        `12` = 0), .Dim = 12L, .Dimnames = list(c("1", "2", "3", 
        "4", "5", "6", "7", "8", "9", "10", "11", "12"))), structure(c(`1` = 0, 
        `2` = 0, `3` = 0, `4` = 0, `5` = 0, `6` = 0.19, `7` = 0, 
        `8` = 0), .Dim = 8L, .Dimnames = list(c("1", "2", "3", "4", 
        "5", "6", "7", "8")))), Day_4 = list(structure(c(`1` = 0.521, 
    `2` = 0.229, `3` = 0, `4` = 0, `5` = 0, `6` = 0, `7` = 0, `8` = 0, 
    `9` = 0, `10` = 0, `11` = 0, `12` = 0), .Dim = 12L, .Dimnames = list(
        c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", 
        "12"))), structure(c(`1` = 0.75, `2` = 0, `3` = 0, `4` = 0, 
    `5` = 0, `6` = 0, `7` = 0, `8` = 0), .Dim = 8L, .Dimnames = list(
        c("1", "2", "3", "4", "5", "6", "7", "8"))))))

I попробовал этот код;

nested_lapply <- function(data, fun) {
    lapply(data, function(sublist) { lapply(sublist, fun) })
}

Но я получаю эту ошибку

res<-nested_lapply(out, max)
Error in FUN(X[[i]], ...) : invalid 'type' (list) of argument
Called from: lapply(sublist, fun)

Дополнение к вопросу:

Мне нужно найти Максимум. значения для всех [[ 1 ]], а также [[2]].

max1 <-max (вне $ <code>Cluster 1 $ Day_1 [ 1 ], вне $ Cluster 1 $ Day_2 [ 1 ], вне $ Cluster 2 $ Day_3 [ 1 ], из $ Cluster 2 $ Day_4 [ 1 ])

max2 <-max (вне $ <code>Cluster 1 $ Day_1 [[2 ]], вне $ Cluster 1 $ Day_2 [[2]], вне $ Cluster 2 $ Day_3 [[2]], вне $ Cluster 2 $ Day_4 [[2]])

Ответы [ 3 ]

4 голосов
/ 08 апреля 2020

Мы можем просто использовать rapply из base R, который будет рекурсивно l oop по трем вложенным list и получить max из внутреннего vector

rapply(out, max)

Если мы хотим через max

library(dplyr)
library(data.table)
reshape2::melt(out) %>% 
   group_by(L3) %>%
   summarise(value = max(value))
# A tibble: 2 x 2
#    L3 value
#  <int> <dbl>
#1     1  1.27
#2     2  1.27

Или это может быть

flatten(out) %>% 
      transpose %>% 
      map(reduce, pmax)
#[[1]]
#    1     2     3     4     5     6     7     8     9    10    11    12 
#1.070 0.229 1.270 0.190 0.000 0.000 0.000 0.000 0.190 0.673 0.000 0.766 

#[[2]]
#    1     2     3     4     5     6     7     8 
#1.070 1.270 0.190 0.000 0.000 0.190 0.673 0.766 

Или одно значение

flatten(out) %>% 
    transpose %>%
    map_dbl(reduce, max)
#[1] 1.27 1.27
1 голос
/ 08 апреля 2020

вы можете сделать что-то вроде этого

lapply(1:length(data), function(X) lapply(data[[X]], FUN))
1 голос
/ 08 апреля 2020

Вы можете использовать это решение

library(tidyverse)
library(purrr)
df %>% 
  enframe() %>% 
  unnest_longer(value) %>% 
  unnest_longer(value) %>% 
  transmute(name, value_id, out = map_dbl(value, max))
...