Vamos dizer que eu quero adicionar 1 a cada valor de uma coluna usando dplyr
e avaliação padrão.
Eu posso fazer :
library(dplyr)
data <- head(iris)
var <- "Sepal.Length"
mutate(data, !!rlang::sym(var) := !!quo(`+`(!!rlang::sym(var), 1)))
Mas e se eu quiser usar +
como operador binário e não como função? Eu não consigo descobrir como escrever o +
com um símbolo em um quosure. Na maioria das minhas tentativas, recebi um erro ao tentar usar um argumento não numérico (o símbolo, por exemplo) com o operador binário +
.
Com o obsoleto mutate_
você pode usar lazyeval::interp
o que permitiu que você fizesse isso facilmente:
mutate_(data, .dots = setNames(list(lazyeval::interp(~var + 1, var = as.symbol(var))), var))
Qualquer ajuda seria apreciada. Obrigado.
Respostas:
3 para resposta № 1Você pode simplesmente usar
mutate(data, !!rlang::sym(var) := (!!rlang::sym(var)) + 1)
Observe os parênteses ao redor da parte bang-bang. Isso é necessário apenas porque você provavelmente está usando uma versão mais antiga do rlang. Nas versões mais antigas (<0,2) !!
tem uma precedência muito baixa, então a adição acontece antes da expansão. Começando com rlang 0.2 o !!
foi dada uma precedência de operador diferente e funciona mais como você poderia esperar.
Claro, se você está aplicando a mesma transformação em um monte de colunas, você pode querer usar o mutate_at
, mutate_all
ou mutate_if
versões, que também permitem que as transformações sejam específicas com a sintaxe da fórmula.
mutate_if(data, is.numeric, ~.x+1)
mutate_all(data, ~.x+1)
mutate_at(data, var, ~.x+1)