studio - dplyr summaryize() y aggregise_each() realizan llamadas adicionales a las funciones proporcionadas
r dplyr cheat sheet (1)
Aunque este problema aún está presente en dplyr 0.5.0 (publicado el 2016-06-24), se soluciona en el repro de dplyr GitHub. Se solucionó con este compromiso realizado el 2016-09-24. He confirmado que puedo reproducir el problema cuando compruebo y compilo la versión en la confirmación anterior, pero no cuando compilo desde esa o las posteriores.
(Y sí, probé un montón de otros antes de encontrarlo. Por eso me esfuerzo tanto con la esperanza de ganar puntos de Internet imaginarios, lo dejo como una pregunta para mi terapeuta. :)
En particular, en la función SEXP process_data(const Data& gdf)
en inst/include/dplyr/Result/CallbackProcessor.h
, tenga en cuenta estos cambios:
CLASS* obj = static_cast<CLASS*>(this);
typename Data::group_iterator git = gdf.group_begin();
RObject first_result = obj->process_chunk(*git);
++git; // This line was added
y
for (int i = 1; i < ngroups; ++git, ++i) { // changed from starting at i = 0
RObject chunk = obj->process_chunk(*git);
[Comentarios agregados por mí, no parte de la fuente real]
Parece que summarise_each
y summarise_each
están realizando llamadas adicionales innecesarias a las funciones de devolución de llamada que reciben. Supongamos que tenemos los siguientes
X <- data.frame( Group = rep(c("G1","G2"),2:3), Var1 = 1:5, Var2 = 11:15 )
que se parece a esto:
Group Var1 Var2
1 G1 1 11
2 G1 2 12
3 G2 3 13
4 G2 4 14
5 G2 5 15
Supongamos además que tenemos una función (potencialmente cara)
f <- function(v)
{
cat( "Calling f with vector", v, "/n" )
## ...additional bookkeeping and processing...
mean(v)
}
que nos gustaría aplicar a cada una de nuestras variables en cada grupo. Usando dplyr
, podríamos hacerlo de la siguiente manera:
X %>% group_by( Group ) %>% summarise_each( funs(f) )
Sin embargo, la salida muestra que f
se llamó una vez adicional para cada variable en G1:
Calling f with vector 1 2
Calling f with vector 1 2
Calling f with vector 3 4 5
Calling f with vector 11 12
Calling f with vector 11 12
Calling f with vector 13 14 15
# A tibble: 2 x 3
Group Var1 Var2
<fctr> <dbl> <dbl>
1 G1 1.5 11.5
2 G2 4.0 14.0
El mismo problema está presente cuando se utiliza summarize
:
> X %>% group_by( Group ) %>% summarise( test = f(Var1) )
Calling f with vector 1 2
Calling f with vector 1 2
Calling f with vector 3 4 5
# A tibble: 2 × 2
Group test
<fctr> <dbl>
1 G1 1.5
2 G2 4.0
¿Por qué está sucediendo esto y cómo se haría para prevenir que summarise
y summarise
summarise_each
realicen esas llamadas adicionales?
(Esto está usando la versión 3.3.0 de R
y la versión 0.5.0 de dplyr
)
EDITAR: Parece que el problema tiene que ver con la interacción entre group_by
y summarise_each
/ summarise_each
. Sin la agrupación, no se hacen llamadas extra. Además, mutate_each
y mutate_each
no sufren este problema. (Crédito: eddi y eipi10 por estos hallazgos)