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]]
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 <ruben.coca en gmail.com> 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 >-- Saludos, Carlos Ortega www.qualityexcellence.es [[alternative HTML version deleted]]
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