Discussion:
[R-es] Más allá de group_by()
Rubén Coca
2018-01-25 12:14:26 UTC
Permalink
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]]
Carlos Ortega
2018-01-25 13:55:42 UTC
Permalink
Hola Rubén,

Para hacer estos cálculos, tienes que partir de las tablas de clientes de
tu "Mes_1" y de tu "Mes_2" y utilizar las funciones de mezcla de tablas que
tiene dplyr (left_join ,right_join, inner_join) con los que identificarás
los clientes que están en un mes y en otro y sumar sus cantidades de cada
caso. Y al final esas cantidades (serán data.frames) mezclarlos con la
tabla que has calculado (la inicial que no tiene ni "win" ni "loss")...

La recomendación de dplyr para hacer los joins, perfectamente la puedes
sustituir por otros paquetes/funciones: sqldf, el mismo paquete base con
"merge()", etc...


Saludos,
Carlos Ortega
www.qualityexcellence.es
Post by Rubén Coca
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,
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
df <- df %>% group_by(mes) %>% summarise(sumFact = sum(fact))
mes sumFact
1 430
2 380
3 280
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
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
https://stat.ethz.ch/mailman/listinfo/r-help-es
--
Saludos,
Carlos Ortega
www.qualityexcellence.es

[[alternative HTML version deleted]]
Álvaro Hernández
2018-01-26 08:24:42 UTC
Permalink
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
Post by Rubén Coca
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,
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
df <- df %>% group_by(mes) %>% summarise(sumFact = sum(fact))
mes sumFact
1 430
2 380
3 280
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
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
https://stat.ethz.ch/mailman/listinfo/r-help-es
Loading...