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