R Отображение различных функций во вложенный список

Используя базовый R, я хотел бы применить другую функцию к каждому элементу вложенного списка. Я знаю, как применить такую ​​же функцию к вложенному списку с

lapply (список, lapply, функция).

Однако я ищу элегантный способ применить разные функции к каждому элементу. Приведенный ниже код работает, но я нахожу использование

функция (x) lapply (x, function (x))

уродливо, поэтому я надеюсь, что есть более элегантное решение.

Data <- list(
    Panel1 = list(
        DF1 = data.frame(A = rnorm(10), B = rnorm(10)),
        DF2 = data.frame(A = rnorm(10), B = rnorm(10))
    ),
    Panel2 = list(
        DF1 = data.frame(C = rnorm(10), D = rnorm(10)),
        DF2 = data.frame(C = rnorm(10), D = rnorm(10))
        )
)

Fns <- list(
    function(x) lapply(x, function(x) x[1:5, c("B", "A")]),
    function(x) lapply(x, function(x) x[1:5, c("D", "C")])
)

Map(function(a, b) b(a), Data, Fns)

person user1491868    schedule 19.07.2019    source источник
comment
похоже, что функция ?compose в пакете purrr может быть полезна в вашем случае.   -  person Chuan    schedule 19.07.2019
comment
Вы находите Map уродливым?   -  person Rui Barradas    schedule 19.07.2019
comment
Это еще один способ, но я не думаю, что он более элегантный lapply(1:2,function(f){ funx <- Fns[[f]] funx(Data[[f]]) })   -  person Mike    schedule 19.07.2019
comment
У меня два вопроса: (1) вы хотите применить разные функции к вложенному списку, но в вашем примере используется та же функция (подмножество с []), и отличаются только аргументы. Вы хотите сделать второе или первое? (2) Могут быть более краткие подходы с использованием tidyverse, но если я правильно понимаю ваш вопрос, вы ищете подход Base R, верно?   -  person TimTeaFan    schedule 20.07.2019
comment
Кроме того, если вы хотите применить одну и ту же функцию с разными аргументами, следующий вопрос будет: могут ли аргументы выбираться функцией. Тогда также может работать вложенное lapply: sub_fn ‹- function (ls, x) lapply (ls, function (x) x [1: 5, colnames (x)]) lapply (Data, sub_fn)   -  person TimTeaFan    schedule 20.07.2019
comment
(1) Первые, совершенно разные функции. (2) Да, основание R. (3) Нет, функция не может выбирать аргументы. Элементы моего списка часто представляют собой data.frames, которые похожи в своем собственном списке, но отличаются за его пределами. Наконец, Map (function (a, b) b (a), Data, Fns) отлично работает с невложенными списками. Я использую это все время. Может быть, Map (function (x) Map (function (a, b) b (a), x, Fns)) будет работать.   -  person user1491868    schedule 20.07.2019


Ответы (1)


Хорошо, я думаю, что смогу ответить на свой вопрос. Это работает, и я думаю, что это так просто, как вы можете получить с базой R.

Data <- list(
    Panel1 = list(
        DF1 = data.frame(A = rnorm(10), B = rnorm(10)),
        DF2 = data.frame(A = rnorm(10), B = rnorm(10))
    ),
    Panel2 = list(
        DF1 = data.frame(C = rnorm(10), D = rnorm(10)),
        DF2 = data.frame(C = rnorm(10), D = rnorm(10))
    )
)

Fns <- list(
    function(x) x[1:5, c("B", "A")],
    function(x) x[1:5, c("D", "C")]
)

Map(function(a, b) lapply(a, b), Data, Fns)
person user1491868    schedule 20.07.2019