[R-es] Más allá de group_by()

Álvaro Hernández alvarohv en um.es
Vie Ene 26 09:24:42 CET 2018


Hola, Rubén:

Una opción que veo yo es completar los clientes por meses, calcular para 
cada cliente lo que dió el mes anterior (con la función lag()) y luego 
sumar si antes había dado 0 o sumar si ahora pasa a dar 0.

Con el código creo que se entiende mejor:

df %>%
   complete(mes, cliente, fill = list(fact = 0)) %>%
   group_by(cliente) %>%
   mutate(ant = lag(fact)) %>%
   group_by(mes) %>%
   summarise(sumFact = sum(fact),
             win = sum(fact[ant == 0]),
             loss = sum(ant[fact == 0])) %>%
   print()

Un saludo
Álvaro

El 25/01/18 a las 13:14, Rubén Coca escribió:
> Hola,
> Os planteo una situación a ver si se os ocurre un enfoque que me permita
> solucionarla.
> Partiendo de un data frame con las siguientes variables: mes, cliente,
> facturacion. Tal que así:
>
> df <- data.frame(mes = c(1,1,1,1,2,2,2,2,3,3,3), cliente = c('a', 'b', 'c',
> 'd', 'b', 'c', 'd', 'e', 'b', 'd', 'e'), fact = c(100, 110, 120, 100, 90,
> 80, 110, 100, 90, 70, 120))
>
> mes   cliente   fact
>    1         a    100
>    1         b    110
>    1         c    120
>    1         d    100
>    2         b     90
>    2         c     80
>    2         d    110
>    2         e    100
>    3         b     90
>    3         d     70
>    3         e    120
>
> Con un simple group_by() y summarise() obtengo:
> df <- df %>% group_by(mes) %>% summarise(sumFact = sum(fact))
>
> mes   sumFact
>    1       430
>    2       380
>    3       280
>
> Y ahora viene lo complicado (para mí), quiero añadir dos nuevas columnas:
> win y loss.
> win debe sumar la facturacion de aquellos clientes que no existían en el
> mes n-1. Loss debe sumar la facturación en el mes n-1 de los clientes que
> ya no están en el mes n (y así sucesivamente). De forma que obtengamos el
> data frame final:
>
> mes   sumFact   win   loss
>    1       430    NA     NA
>    2       380   100    100
>    3       280     0     80
>
> En el mes 2, win es la suma de la facturación del cliente e, que no estaba
> en el mes 1 y loss es la suma de la facturación del cliente a, que estaba
> en el mes 1 pero ya no en el 2.
> En el mes 3, win es 0 porque no hay ningún cliente que no existiense en n-1
> y loss es la suma de la facturación del cliente c, que estaba en el mes 2
> pero no en el 3.
>
> Espero haber explicado el caso con suficiente claridad y que podáis
> ayudarme.
> Muchas gracias!
>
> 	[[alternative HTML version deleted]]
>
> _______________________________________________
> R-help-es mailing list
> R-help-es en r-project.org
> https://stat.ethz.ch/mailman/listinfo/r-help-es



Más información sobre la lista de distribución R-help-es