Digamos que eu tenha estes dados de exemplo:
library(tidyverse)
colNames <- c('A', 'B')
df <- tibble(A = sample(1:1000, 20),
A_Direction = 'Decreasing',
B = sample(1:1000, 20),
B_Direction = 'Increasing')
Quero alterar as colunas A
de B
forma que, se A_Direction
ou B_Direction
estiver diminuindo, seja 0 e, se estiver aumentando, seja 1. Aqui está o que tentei:
dfNew <- df %>%
mutate(across(.cols = matches(paste0('^', colNames, '$')),
.fns = ~ifelse(test = paste0(cur_column(), '_Direction')=='Decreasing',
yes = 0,
no = 1)))
Mas é claro que ele não reconhece o test
argumento porque é uma string, então ambas as colunas se tornam 1
. Alguma idéia de como posso fazer isso programaticamente (os dados do OG têm muito, muito mais colunas como esta).
Outra opção seria agrupar o nome da coluna, também conhecido
paste0(cur_column(), "_Direction")
comoget
.Observação: também deixei cair o
ifelse
.ou usando
pick()
:Se você já tiver feito isso,
colNames
poderá fazer uma pesquisa de vetor nomeado:Ou você pode acessar
across()
como:E por último, se seus dados reais tiverem mais valores do que apenas Aumentar/Decrementar, você pode usar
case_match()
assim, que também tem umdefault
argumento:Basta adicionar mais valores conforme mostrado (por exemplo
"Constant" ~ NA
).A vantagem de usar
pick()
(em vez dodf
que mencionei nos comentários do seu post) é que se você modificou suas variáveis em seu pipeline, esta função recuperará os valores em seu estado atual:Aqui está uma maneira pragmática de resolver: