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