Os dados do brinquedo a seguir têm 5 variáveis, X1
para X5
.
set.seed(123)
df <- data.frame(matrix(rnorm(500), 100, 5))
Quero executar operações específicas em variáveis específicas, usando uma lista nomeada de fórmulas lambda no estilo purrr
fun_list <- list(
X2 = ~ quantile(.x, c(0.1, 0.9), na.rm = TRUE),
X4 = ~ fivenum(.x, na.rm = TRUE)
)
Como posso aplicar fun_list
meu df
de acordo com seus nomes de variáveis?
Eu sei rlang::as_function()
que pode converter uma fórmula estilo purrr em uma função R. Mas acho que há alguma função que é capaz de lidar com fórmulas estilo purrr intrinsecamente. Seu uso pode ser
execute(fun_list, environment = df)
A saída esperada é
$X2
10% 90%
-1.289408 1.058432
$X4
[1] -2.465898194 -0.737146704 -0.003508661 0.693634712 2.571458146
Uma solução alternativa é usar um
map
, que pode receber uma fórmula no estilo purrr como entrada e evitar o uso derlang::as_function()
.ou resumidamente,
imap(fun_list, ~ map(df[.y], .x)[[1]])
.1) Aqui está uma solução base R. Primeiro, criamos uma função,
fo2fun
, que aceita uma fórmula e gera a função correspondente. Então,execute
é uma função com um corpo de uma instrução usandoMap
para aplicá-la a cada fórmula e nome/índice de lista.2) É o mesmo que (1), exceto que usamos
match.funfn
do pacote gsubfn no lugar defo2fun
.Com essa abordagem, o argumento formal não é restrito a ser
.x
, masmatch.funfn
assume que qualquer variável livre encontrada na fórmula é o argumento. Opcionalmente, especifique a variável do argumento no lado esquerdo da fórmula. Esta última sintaxe deve ser usada se houver variáveis livres sem argumento na fórmula para distinguir o argumento, mas também pode ser usada mesmo se não houver.Observação
Entrada da pergunta: