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 / 79590966
Accepted
robertspierre
robertspierre
Asked: 2025-04-24 23:18:28 +0800 CST2025-04-24 23:18:28 +0800 CST 2025-04-24 23:18:28 +0800 CST

Diferença entre if_any(any_of(vars)) e if_any(all_of(vars))

  • 772

Considere o seguinte MWE:

df <- data.frame(a=c(TRUE, TRUE, FALSE), b=c(FALSE, TRUE, FALSE))
myvars <- c("a","b")

O objetivo é construir uma coluna cque seja VERDADEIRA em cada linha se um ou ambos ae bforem VERDADEIROS.

É necessário que a lista de variáveis ​​a serem usadas seja mantida pelo caractere vetorial myvars.

Com

df %>% mutate(c=if_any(myvars))

Eu entendo:

! Using an external vector in selections was deprecated in tidyselect 1.1.0.
ℹ Please use `all_of()` or `any_of()` instead.
  # Was:
  data %>% select(myvars)

  # Now:
  data %>% select(all_of(myvars))

See <https://tidyselect.r-lib.org/reference/faq-external-vector.html>.

Diante disso, tenho que fazer:

df %>% mutate(c=if_any(any_of(myvars)))
df %>% mutate(c=if_any(all_of(myvars)))

Mas não entendo a diferença entre os dois.

if_anydeveria implicar any_of.

Qual é a diferença entre os dois?

  • 3 3 respostas
  • 71 Views

3 respostas

  • Voted
  1. Best Answer
    Gregor Thomas
    2025-04-24T23:20:49+08:002025-04-24T23:20:49+08:00

    A diferença é se essas colunas precisam ou não estar no quadro de dados. all_of()gerará um erro se você incluir quaisquer colunas que não estejam no quadro de dados. any_of()funcionará com facilidade com quaisquer colunas que estejam presentes no quadro de dados, ignorando as que não estiverem.

    Para segurança do código, você deve usar all_of()sempre que possível, mas às vezes, por exemplo, você está escrevendo scripts para trabalhar em entradas semelhantes que têm colunas ligeiramente diferentes, o que any_of()é muito útil neste caso.

    "x"Para ilustrar, vamos adicionar a coluna inexistente a myvars:

    ## any_of still works
    df %>% mutate(c=if_any(any_of(c(myvars, "x"))))
    #       a     b     c
    # 1  TRUE FALSE  TRUE
    # 2  TRUE  TRUE  TRUE
    # 3 FALSE FALSE FALSE
    
    
    ## all_of throws an error: ✖ Element `x` doesn't exist.
    df %>% mutate(c=if_any(all_of(c(myvars, "x"))))
    # Error in `mutate()`:
    # ℹ In argument: `c = if_any(all_of(c(myvars, "x")))`.
    # Caused by error in `if_any()`:
    # ℹ In argument: `all_of(c(myvars, "x"))`.
    # Caused by error in `all_of()`:
    # ! Can't subset elements that don't exist.
    # ✖ Element `x` doesn't exist.
    

    Isso é explicado na página de ajuda compartilhada acessível em ?any_ofou ?all_of:

    • all_of()é para seleção estrita. Se alguma das variáveis ​​no vetor de caracteres estiver ausente, um erro será gerado.

    • any_of() Não verifica se há variáveis ​​ausentes. É especialmente útil com seleções negativas, quando você quer ter certeza de que uma variável foi removida.

    • 3
  2. 2025-04-25T00:00:29+08:002025-04-25T00:00:29+08:00

    O objetivo é construir uma coluna c que seja VERDADEIRA em cada linha se um ou ambos a e b forem VERDADEIROS.

    Essa é rowSums()uma tarefa simples!

    X = data.frame(A=c(TRUE, TRUE, FALSE), B=c(FALSE, TRUE, FALSE))
    myvars = c('A', 'B')
    X$C = rowSums(X[myvars]) > 0
    
    > X
          A     B     C
    1  TRUE FALSE  TRUE
    2  TRUE  TRUE  TRUE
    3 FALSE FALSE FALSE
    

    Nota. Renomeado dfpara Xe transformado em letras maiúsculas os nomes das colunas (variáveis).

    • 1
  3. jay.sf
    2025-04-25T00:10:02+08:002025-04-25T00:10:02+08:00

    data.tableAqui está uma alternativa mais rápida e ainda legível :

    > library(data.table)
    > setDT(df)
    > df[, c := Reduce(`|`, .SD), .SDcols=myvars][]
            a      b      c
       <lgcl> <lgcl> <lgcl>
    1:   TRUE  FALSE   TRUE
    2:   TRUE   TRUE   TRUE
    3:  FALSE  FALSE  FALSE
    

    O Base R também permite isso, mas geralmente é mais lento:

    > df |> transform(c=Reduce(`|`, lapply(myvars, \(x) df[[x]])))
          a     b     c
    1  TRUE FALSE  TRUE
    2  TRUE  TRUE  TRUE
    3 FALSE FALSE FALSE
    

    Referência

    $ Rscript --vanilla foo.R
    Unit: milliseconds
           expr        min         lq       mean     median         uq       max neval cld
        Reduce1  72.390647  77.901894  91.130995  94.438733  95.883708 160.43279   100 a  
        Reduce2  73.689306  77.874417  92.030412  94.866177  96.025324 160.32231   100 a  
        rowSums 113.689026 130.263562 137.712968 132.074253 144.814603 214.01530   100  b 
     data.table   2.379800   2.587120   4.352990   2.667881   2.741449  82.73747   100   c
          dplyr   2.772497   3.448753   4.733899   3.503982   3.550173  24.29669   100   c
    

    Código:

    library(magrittr)
    library(data.table)
    options(width=200)
    df <- df[sample.int(nrow(df), 1e6, replace=TRUE), ]
    dt <- as.data.table(df)
    microbenchmark::microbenchmark(
      Reduce1=df |> transform(c=Reduce(`|`, lapply(myvars, \(x) df[[x]]))),
      Reduce2=df |> transform(c=Reduce("|", df[myvars])),
      rowSums=df |> transform(c=rowSums(df[myvars]) > 0),
      data.table=dt[, c := Reduce(`|`, .SD), .SDcols=myvars][],
      dplyr=df %>% dplyr::mutate(c=dplyr::if_any(dplyr::any_of(c(myvars, "x")))),
      check='equivalent'
    )
    
    • 0

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

    Reformatar números, inserindo separadores em posições fixas

    • 6 respostas
  • Marko Smith

    Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não?

    • 2 respostas
  • Marko Smith

    Problema com extensão desinstalada automaticamente do VScode (tema Material)

    • 2 respostas
  • Marko Smith

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

    • 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

    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
  • Martin Hope
    Fantastic Mr Fox Somente o tipo copiável não é aceito na implementação std::vector do MSVC 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant Encontre o próximo dia da semana usando o cronógrafo 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor O inicializador de membro do construtor pode incluir a inicialização de outro membro? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul O C++20 mudou para permitir a conversão de `type(&)[N]` de matriz de limites conhecidos para `type(&)[]` de matriz de limites desconhecidos? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann Como/por que {2,3,10} e {x,3,10} com x=2 são ordenados de forma diferente? 2025-01-13 23:24:07 +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

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