usar tablas paquete instalar filtrar datos data como casos agrupar r dplyr r-faq rlang

tablas - instalar paquete dplyr en r



Usar nombres de variables en funciones de dplyr. (5)

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 al color por cadena, algo como esto:

var <- "color" filter(df, this_probably_should_be_a_function(var) == "blue").

Estaría encantado de hacerlo de cualquier manera y súper contento de usar la sintaxis dplyr fácil de leer.


A menudo se pregunta, pero todavía no es fácil el apoyo 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


A partir del dplyr 0.3 todas dplyr funciones de dplyr que utilizan una evaluación no estándar (NSE, ver publicación de publicación y vignette ) tienen una doble evaluación estándar (SE) que termina en un guión bajo. Estos pueden ser utilizados 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 cuerda con la condición lógica es, por supuesto, sencillo.

l <- paste(var, "==", "''blue''") filter_(df, l)


A partir del dplyr 0.7, algunas cosas han cambiado de nuevo.

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 programación dplyr .


Aquí hay una forma 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")


También puede utilizar:

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 próximamente se publicará como 0.6.0 (abril de 2017), podemos crear las variables como se cita y luego se anula la cita ( 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, ¡podemos requerir que () envuelva !!

filter(df, (!!var) == "blue") # color value #1 blue 1 #2 blue 3 #3 blue 4