AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 79076724
Accepted
user18894435
user18894435
Asked: 2024-10-11 11:27:53 +0800 CST2024-10-11 11:27:53 +0800 CST 2024-10-11 11:27:53 +0800 CST

Execute uma lista de fórmulas lambda estilo purrr em um quadro de dados

  • 772

Os dados do brinquedo a seguir têm 5 variáveis, X1para 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_listmeu dfde 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
  • 2 2 respostas
  • 49 Views

2 respostas

  • Voted
  1. Best Answer
    Darren Tsai
    2024-10-11T13:31:42+08:002024-10-11T13:31:42+08:00

    Uma solução alternativa é usar um map, que pode receber uma fórmula no estilo purrr como entrada e evitar o uso de rlang::as_function().

    library(purrr)
    
    imap(fun_list, \(f, var) map(df[var], f)[[1]])
    
    # $X2
    #       10%       90% 
    # -1.289408  1.058432 
    # 
    # $X4
    # [1] -2.465898194 -0.737146704 -0.003508661  0.693634712  2.571458146
    

    ou resumidamente, imap(fun_list, ~ map(df[.y], .x)[[1]]).

    • 2
  2. G. Grothendieck
    2024-10-11T16:28:25+08:002024-10-11T16:28:25+08:00

    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 usando Mappara aplicá-la a cada fórmula e nome/índice de lista.

    fo2fun <- function(formula) {
        f <- function(.x) {}
        body(f) <- formula[[2]]
        environment(f)  <- environment(formula)
        f
    }
    
    execute <- function(funs, envir = parent.frame()) {
      Map(\(fo, index) fo2fun(fo)(envir[[index]]), funs, names(fun_list))
    }
    
    # test
    expected <- list(
      X2 = quantile(df$X2, c(0.1, 0.9), na.rm = TRUE), 
      X4 = fivenum(df$X4, na.rm = TRUE)
    )
    
    execute(fun_list, df) |> identical(expected)
    ## [1] TRUE
    
    execute(fun_list, list2env(df)) |> identical(expected)
    ## [1] TRUE
    
    list2env(df, .GlobalEnv)
    execute(fun_list) |> identical(expected)
    ## [1] TRUE
    

    2) É o mesmo que (1), exceto que usamos match.funfndo pacote gsubfn no lugar de fo2fun.

    Com essa abordagem, o argumento formal não é restrito a ser .x, mas match.funfnassume 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.

    library(gsubfn)
    
    fun_list2 <- list(
      X2 = ~ quantile(var, c(0.1, 0.9), na.rm = TRUE),
      X4 = x ~ fivenum(x, na.rm = TRUE)
    )
    
    execute <- function(funs, envir = parent.frame()) {
      Map(\(fo, index) match.funfn(fo)(envir[[index]]), funs, names(fun_list))
    }
    
    # test
    
    execute(fun_list, df) |> identical(expected)
    ## [1] TRUE
    
    execute(fun_list2, df) |> identical(expected)
    ## [1] TRUE
    

    Observação

    Entrada da pergunta:

    set.seed(123)
    df <- data.frame(matrix(rnorm(500), 100, 5))
    
    fun_list <- list(
      X2 = ~ quantile(.x, c(0.1, 0.9), na.rm = TRUE),
      X4 = ~ fivenum(.x, na.rm = TRUE)
    )
    
    • 2

relate perguntas

  • Adicionar número de série para atividade de cópia ao blob

  • A fonte dinâmica do empacotador duplica artefatos

  • Selecione linhas por grupo com 1s consecutivos

  • Lista de chamada de API de gráfico subscritoSkus estados Privilégios insuficientes enquanto os privilégios são concedidos

  • Função para criar DFs separados com base no valor da coluna

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle?

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Quando devo usar um std::inplace_vector em vez de um std::vector?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Martin Hope
    Aleksandr Dubinsky Por que a correspondência de padrões com o switch no InetAddress falha com 'não cobre todos os valores de entrada possíveis'? 2024-12-23 06:56:21 +0800 CST
  • Martin Hope
    Phillip Borge Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle? 2024-12-12 20:46:46 +0800 CST
  • Martin Hope
    Oodini Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores? 2024-12-12 06:27:11 +0800 CST
  • Martin Hope
    sleeptightAnsiC `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso? 2024-11-09 07:18:53 +0800 CST
  • Martin Hope
    The Mad Gamer Quando devo usar um std::inplace_vector em vez de um std::vector? 2024-10-29 23:01:00 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST
  • Martin Hope
    MarkB Por que o GCC gera código que executa condicionalmente uma implementação SIMD? 2024-02-17 06:17:14 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve