Quiero usar nombres de variables como cadenas en funciones de dplyr
. Vea el ejemplo a continuación:
df <- data.frame( color = c("blue", "black", "blue", "blue", "black"), value = 1:5) filter(df, color == "blue")
Funciona perfectamente, pero me gustaría referirme a los color
por cuerdas, algo como esto:
var <- "color" filter(df, this_probably_should_be_a_function(var) == "blue").
Me dplyr
hacerlo de cualquier manera y estoy muy contento de poder utilizar la syntax de dplyr
fácil de leer.
A partir de dplyr 0.3
cada función de dplyr
que utiliza una evaluación no estándar (NSE, ver lanzamiento y viñeta ) tiene una evaluación estándar (SE) gemela que termina en un guión bajo. Estos se pueden usar para pasar variables. Para el filter
será filter_
. Usando filter_
puede pasar la condición lógica como una cadena.
filter_(df, "color=='blue'") # color value # 1 blue 1 # 2 blue 3 # 3 blue 4
Construir la cadena con la condición lógica es, por supuesto, directo
l <- paste(var, "==", "'blue'") filter_(df, l)
También puedes usar:
filter(df, get(var, envir=as.environment(df))=="blue") #color value #1 blue 1 #2 blue 3 #3 blue 4
En la versión de desarrollo de dplyr
y que pronto se lanzará como 0.6.0
(abril de 2017), podemos crear las variables como se cita y luego desmarcar ( UQ
o !!
) para la evaluación
var <- quo(color) filter(df, UQ(var) == "blue") # color value #1 blue 1 #2 blue 3 #3 blue 4
Debido a la precedencia del operador, es posible que necesitemos ()
para envolver !!
filter(df, (!!var) == "blue") # color value #1 blue 1 #2 blue 3 #3 blue 4
A partir de dplyr 0.7, algunas cosas han cambiado nuevamente.
library(dplyr) df <- data.frame( color = c("blue", "black", "blue", "blue", "black"), value = 1:5) filter(df, color == "blue") # it was already possible to use a variable for the value val <- 'blue' filter(df, color == val) # As of dplyr 0.7, new functions were introduced to simplify the situation col_name <- quo(color) # captures the current environment df %>% filter((!!col_name) == val) # Remember to use enquo within a function filter_col <- function(df, col_name, val){ col_name <- enquo(col_name) # captures the environment in which the function was called df %>% filter((!!col_name) == val) } filter_col(df, color, 'blue')
Los casos más generales se explican en la viñeta de progtwigción dplyr .
A menudo se pregunta, pero todavía no es fácil apoyar afaik. Sin embargo, con respecto a esta publicación :
eval(substitute(filter(df, var == "blue"), list(var = as.name(var)))) # color value # 1 blue 1 # 2 blue 3 # 3 blue 4
Aquí hay una manera de hacerlo usando la función sym()
en el paquete rlang
:
library(dplyr) df <- data.frame( main_color = c("blue", "black", "blue", "blue", "black"), secondary_color = c("red", "green", "black", "black", "red"), value = 1:5, stringsAsFactors=FALSE ) filter_with_quoted_text <- function(column_string, value) { col_name <- rlang::sym(column_string) df1 <- df %>% filter(UQ(col_name) == UQ(value)) df1 } filter_with_quoted_text("main_color", "blue") filter_with_quoted_text("secondary_color", "red")