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 c
que seja VERDADEIRA em cada linha se um ou ambos a
e b
forem 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_any
deveria implicar any_of
.
Qual é a diferença entre os dois?
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 queany_of()
é muito útil neste caso."x"
Para ilustrar, vamos adicionar a coluna inexistente amyvars
:Isso é explicado na página de ajuda compartilhada acessível em
?any_of
ou?all_of
:Essa é
rowSums()
uma tarefa simples!Nota. Renomeado
df
paraX
e transformado em letras maiúsculas os nomes das colunas (variáveis).data.table
Aqui está uma alternativa mais rápida e ainda legível :O Base R também permite isso, mas geralmente é mais lento:
Referência
Código: