【问题标题】:R Map differing functions to nested listR将不同的功能映射到嵌套列表
【发布时间】:2019-11-28 18:20:34
【问题描述】:

使用基础 R,我想对嵌套列表的每个元素应用 不同 函数。我知道如何将 same 函数应用于带有

的嵌套列表

lapply(列表,lapply,函数)。

但是,我正在寻找一种优雅的方式来将不同的 函数应用于每个元素。下面的代码有效,但我发现使用

函数(x) lapply(x, 函数(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)

【问题讨论】:

  • 听起来像purrr 包中的?compose 函数可能对您的情况有所帮助。
  • 你觉得Map丑吗?
  • 这是另一种方法,但我不认为它更优雅lapply(1:2,function(f){ funx &lt;- Fns[[f]] funx(Data[[f]]) })
  • 我有两个问题:(1)您想在嵌套列表上应用不同的函数,但您的示例使用相同的函数(使用 [] 进行子集)并且只有参数不同。你想做后者还是前者? (2) 使用 tidyverse 可能有更简洁的方法,但如果我正确理解您的问题,您正在寻找 Base R 方法,对吧?
  • 此外,如果您想应用具有不同参数的相同函数,下一个问题将是:参数是否可以由函数选择。然后嵌套的 lapply 也可能起作用: sub_fn

标签: r list nested mapply


【解决方案1】:

好吧,我想我可以回答我自己的问题。这行得通,我认为它与使用 base 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-31
    • 2023-03-10
    • 2016-02-12
    • 2019-04-26
    • 1970-01-01
    • 2017-05-25
    • 2019-01-19
    • 1970-01-01
    相关资源
    最近更新 更多