以下玩具数据有 5 个变量,X1
至X5
。
set.seed(123)
df <- data.frame(matrix(rnorm(500), 100, 5))
我想使用purrr样式 lambda 公式的命名列表对特定变量执行特定操作
fun_list <- list(
X2 = ~ quantile(.x, c(0.1, 0.9), na.rm = TRUE),
X4 = ~ fivenum(.x, na.rm = TRUE)
)
我怎样才能根据其变量名称应用于fun_list
我的?df
我知道rlang::as_function()
可以将purrr样式的公式转换为 R 函数。但我猜有些函数能够从本质上处理purrr样式的公式。它的用法可能是
execute(fun_list, environment = df)
预期输出为
$X2
10% 90%
-1.289408 1.058432
$X4
[1] -2.465898194 -0.737146704 -0.003508661 0.693634712 2.571458146
一种解决方法是使用嵌套的
map
,它可以将purrr样式的公式作为输入并避免使用rlang::as_function()
。或者简而言之
imap(fun_list, ~ map(df[.y], .x)[[1]])
。1)这是一个基本的 R 解决方案。首先,我们创建一个函数,
fo2fun
它接受一个公式并输出相应的函数。然后execute
是一个具有一个语句主体的函数,用于Map
将其应用于每个公式和列表名称/索引。2)这与(1)相同,只是我们使用了
match.funfn
gsubfn 包中的 代替fo2fun
。使用这种方法,形式参数不仅限于是
.x
,而是match.funfn
假设公式中找到的任何自由变量都是参数。可选择在公式的左侧指定参数变量。如果公式中有非参数自由变量来区分参数,则应使用后一种语法,但即使没有也可以使用。笔记
问题输入: