summarise datasheet r group-by dplyr split-apply-combine

datasheet - summarise by group dplyr



Programando programáticamente group_by() en una variable variable (2)

Aquí hay una solución y cómo llegué.

¿Qué espera group_by?

> group_by function (x, ..., add = FALSE) { new_groups <- named_dots(...)

Por la madriguera del conejo:

> dplyr:::named_dots function (...) { auto_name(dots(...)) } <environment: namespace:dplyr> > dplyr:::auto_name function (x) { names(x) <- auto_names(x) x } <environment: namespace:dplyr> > dplyr:::auto_names function (x) { nms <- names2(x) missing <- nms == "" if (all(!missing)) return(nms) deparse2 <- function(x) paste(deparse(x, 500L), collapse = "") defaults <- vapply(x[missing], deparse2, character(1), USE.NAMES = FALSE) nms[missing] <- defaults nms } <environment: namespace:dplyr> > dplyr:::names2 function (x) { names(x) %||% rep("", length(x)) }

Usando esa información, ¿cómo desarrollar una solución?

# Naive solution fails: ChickWeight %>% do.call( group_by, list( Chick, Diet ) ) %>% summarise( mw = mean( weight ) ) # Slightly cleverer: do.call( group_by, list( x = ChickWeight, Chick, Diet, add = FALSE ) ) %>% summarise( mw = mean( weight ) ) ## But still fails with, ## Error in do.call(group_by, list(x = ChickWeight, Chick, Diet, add = FALSE)) : object ''Chick'' not found

La solución consiste en citar los argumentos para que su evaluación se demore hasta que estén en el entorno que incluye el x tbl:

do.call( group_by, list( x = ChickWeight, quote(Chick), quote(Diet), add = FALSE ) ) %>% summarise( mw = mean( weight ) ) ## Bingo! v <- "Diet" do.call( group_by, list( x = ChickWeight, quote(Chick), substitute( a, list( a = v ) ), add = FALSE ) ) %>% summarise( mw = mean( weight ) )

Utilizando dplyr, me gustaría resumir [sic] por una variable que puedo variar (por ejemplo, en un comando loop o apply-style).

Escribir los nombres directamente funciona bien:

library(dplyr) ChickWeight %>% group_by( Chick, Diet ) %>% summarise( mw = mean( weight ) )

Pero group_by no se escribió para tomar un vector de caracteres, por lo que es más difícil pasar los resultados.

v <- "Diet" ChickWeight %>% group_by( c( "Chick", v ) ) %>% summarise( mw = mean( weight ) ) ## Error

Publicaré una solución, pero tengo curiosidad por ver cómo otros han resuelto esto.


Las funciones de subrayado de dplyr podrían ser útiles para eso:

ChickWeight %>% group_by_( "Chick", v ) %>% summarise( mw = mean( weight ) )

De las nuevas características en dplyr 0.3 :

Ahora puede programar con dplyr: cada función que utiliza una evaluación no estándar (NSE) también tiene un gemelo de evaluación estándar (SE) que termina en _ . Por ejemplo, la versión SE de filter () se llama filter _ (). La versión SE de cada función tiene argumentos similares, pero deben ser explícitamente "citados".