Programación funcional con dplyr
Buscando una manera más eficiente / elegante de pasar múltiples argumentos a un grupo mediante el uso de evaluación no estándar en una función que utiliza dplyr. No quiero usar el operador ..., sino especificar las funciones individualmente.
Mi caso de uso específico es una función que toma un marco de datos y crea un objeto ggplot con una sintaxis más simple. Aquí hay un ejemplo del código que quiero automatizar con mi función:
# create data frame
my_df <- data.frame(month = sample(1:12, 1000, replace = T),
category = sample(head(letters, 3), 1000, replace = T),
approved = as.numeric(runif(1000) < 0.5))
my_df$converted <- my_df$approved * as.numeric(runif(1000) < 0.5)
my_df %>%
group_by(month, category) %>%
summarize(conversion_rate = sum(converted) / sum(approved)) %>%
ggplot + geom_line(aes(x = month, y = conversion_rate, group = category,
color = category))
Quiero combinar group_by, summaryize, ggplot y geom_line en una función simple que pueda alimentar a x, y y group, y hacer que realice todo el trabajo sucio debajo del capó. Esto es lo que llegué a trabajar:
# create the function that does the grouping and plotting
plot_lines <- function(df, x, y, group) {
x <- enquo(x)
group <- enquo(group)
group_bys <- quos(!! x, !! group)
df %>%
group_by(!!! group_bys) %>%
my_smry %>%
ggplot + geom_line(aes_(x = substitute(x), y = substitute(y),
group = substitute(group), color = substitute(group)))
}
# create a function to do the summarization
my_smry <- function(x) {
x %>%
summarize(conversion_rate = sum(converted) / sum(approved))
}
# use my function
my_df %>%
plot_lines(x = month, y = conversion_rate, group = category)
Siento que el manejo de group_by es poco elegante: citandox
ygroup
conenquo
, luego quitándolos con!!
dentro de otra función de cotizaciónquos
, solo para volver a citarlos con!!!
en la siguiente línea, pero es lo único que he podido poner a trabajar. ¿Hay una mejor manera de hacer esto?
Además, ¿hay alguna manera de hacer que ggplot tome!!
en lugar desubstitute
? Lo que estoy haciendo se siente inconsistente.