Use nombres de variables en funciones de dplyr

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 

Actualizar

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")