【发布时间】: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 <- Fns[[f]] funx(Data[[f]]) }) -
我有两个问题:(1)您想在嵌套列表上应用不同的函数,但您的示例使用相同的函数(使用 [] 进行子集)并且只有参数不同。你想做后者还是前者? (2) 使用 tidyverse 可能有更简洁的方法,但如果我正确理解您的问题,您正在寻找 Base R 方法,对吧?
-
此外,如果您想应用具有不同参数的相同函数,下一个问题将是:参数是否可以由函数选择。然后嵌套的 lapply 也可能起作用: sub_fn