Digamos que quiero agregar 1 a cada valor de una columna usando dplyr
y evaluacion estandar.
Puedo hacer :
library(dplyr)
data <- head(iris)
var <- "Sepal.Length"
mutate(data, !!rlang::sym(var) := !!quo(`+`(!!rlang::sym(var), 1)))
Pero que tal si me gustaría usar +
¿Como operador binario y no como función? No puedo averiguar cómo escribir el +
Con un símbolo en un quosure. En la mayoría de mis intentos obtuve un error al intentar usar un argumento no numérico (el símbolo, por ejemplo) con el operador binario +
.
Con los desaprobados. mutate_
puedes usar lazyeval::interp
lo que te permitió hacerlo fácilmente:
mutate_(data, .dots = setNames(list(lazyeval::interp(~var + 1, var = as.symbol(var))), var))
Cualquier ayuda sería apreciada. Gracias.
Respuestas
3 para la respuesta № 1Solo puedes usar
mutate(data, !!rlang::sym(var) := (!!rlang::sym(var)) + 1)
Tenga en cuenta el paréntesis alrededor de la parte bang-bang. Esto solo es necesario porque probablemente esté usando una versión anterior de rlang. En versiones anteriores (<0.2) la !!
Tiene una prioridad muy baja, por lo que la adición ocurre antes de la expansión. Comenzando con rlang 0.2 el !!
se le ha dado una prioridad de operador diferente y funciona más como usted podría esperar.
Por supuesto, si está aplicando la misma transformación a un grupo de columnas, es posible que desee utilizar la mutate_at
, mutate_all
, o mutate_if
versiones, que también permiten que las transformaciones sean específicas con la sintaxis de la fórmula.
mutate_if(data, is.numeric, ~.x+1)
mutate_all(data, ~.x+1)
mutate_at(data, var, ~.x+1)