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

2018-01-26 Por tema Álvaro Hernández

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 a100
   1 b110
   1 c120
   1 d100
   2 b 90
   2 c 80
   2 d110
   2 e100
   3 b 90
   3 d 70
   3 e120

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   430NA NA
   2   380   100100
   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@r-project.org
https://stat.ethz.ch/mailman/listinfo/r-help-es


___
R-help-es mailing list
R-help-es@r-project.org
https://stat.ethz.ch/mailman/listinfo/r-help-es


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

2018-01-25 Por tema Carlos Ortega
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

El 25 de enero de 2018, 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 a100
>   1 b110
>   1 c120
>   1 d100
>   2 b 90
>   2 c 80
>   2 d110
>   2 e100
>   3 b 90
>   3 d 70
>   3 e120
>
> 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   430NA NA
>   2   380   100100
>   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@r-project.org
> https://stat.ethz.ch/mailman/listinfo/r-help-es
>



-- 
Saludos,
Carlos Ortega
www.qualityexcellence.es

[[alternative HTML version deleted]]

___
R-help-es mailing list
R-help-es@r-project.org
https://stat.ethz.ch/mailman/listinfo/r-help-es


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

2018-01-25 Por tema 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,
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 a100
  1 b110
  1 c120
  1 d100
  2 b 90
  2 c 80
  2 d110
  2 e100
  3 b 90
  3 d 70
  3 e120

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   430NA NA
  2   380   100100
  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@r-project.org
https://stat.ethz.ch/mailman/listinfo/r-help-es