es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Retorno porcentaje restante dentro de un grupo, utilizando la primera fecha del conteo del grupo.

No es el mejor título, pero estoy tratando de realizar un seguimiento de las tareas pendientes utilizando exportaciones de datos semanales. Quiero usar el recuento total de tareas a partir de la fecha mínima (por ejemplo, 1 de enero) de cada año como una variable para devolver el porcentaje restante (proporción) cada semana durante ese año. Ver ejemplo:

dt <- data.table(id.date=as.Date(c(rep('2019-01-01',80),rep('2019-01-08',60),rep('2019-01-15',40),
                         rep('2019-01-22',40),rep('2020-01-01',70),rep('2020-01-08',50),
                         rep('2020-01-15',40),rep('2020-01-29',20))),
           task.type=rep('taskA'))[order(id.date)][,year:=year(id.date)]

2 registros de ejemplo por informe semanal

dt[,.SD[sample(.N,min(2,.N))],by=id.date]
id.date  task.type year
  <date>    <chr>  <int>
2019-01-01  taskA   2019<br>
2019-01-01  taskA   2019<br>
2019-01-08  taskA   2019<br>
2019-01-08  taskA   2019<br>
2019-01-15  taskA   2019<br>
2019-01-15  taskA   2019<br>
2019-01-22  taskA   2019<br>
2019-01-22  taskA   2019<br>
2020-01-01  taskA   2020<br>
2020-01-01  taskA   2020
2020-01-08  taskA   2020<br>
2020-01-08  taskA   2020<br>
2020-01-15  taskA   2020
2020-01-15  taskA   2020<br>
2020-01-29  taskA   2020<br>
2020-01-29  taskA   2020


Y el resultado deseado:

para los informes semanales en 2019, se utilizarían 80 tareas para todos los informes en 2019

y para 2020, se usarían 70.

id.date   N    pct.rem
  <date>   <int>    <dbl>
2019-01-01  80  1.0000000<br>
2019-01-08  60  0.7500000<br>
2019-01-15  40  0.5000000<br>
2019-01-22  40  0.5000000<br>
2020-01-01  70  1.0000000<br>
2020-01-08  50  0.7142857<br>
2020-01-15  40  0.5714286<br>
2020-01-29  20  0.2857143

He intentado rehacer algunas de las respuestas de esta discusión de SO aquí. Pero sin éxito. Supongo que necesito utilizar .SD o .EACHI de alguna manera, pero recién estoy empezando con data.table.

Cualquier orientación aquí es muy apreciada. Avísame si necesitas más claridad. Gracias.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para calcular el porcentaje de tareas restantes cada semana, primero necesitamos calcular el número total de tareas a partir de la fecha mínima de cada año. Podemos lograr esto utilizando el paquete dplyr para agrupar los datos por año y luego calcular el número total de tareas a partir de la fecha mínima de cada año. Luego podemos combinar esta información con el conjunto de datos original utilizando la función merge y calcular el porcentaje de tareas restantes cada semana como una proporción del total de tareas a partir de la fecha mínima de ese año. Aquí está el código para lograr esto:

    library(data.table)
    library(dplyr)
    
    # cargar los datos
    dt <- data.table(id.date=as.Date(c(rep('2019-01-01',80),rep('2019-01-08',60),rep('2019-01-15',40),
                             rep('2019-01-22',40),rep('2020-01-01',70),rep('2020-01-08',50),
                             rep('2020-01-15',40),rep('2020-01-29',20))),
               task.type=rep('taskA'))[order(id.date)][,year:=year(id.date)]
    
    # calcular el total de tareas a partir de la fecha mínima de cada año
    total_tasks <- dt %>% 
      group_by(year) %>% 
      filter(id.date == min(id.date)) %>% 
      summarise(total_tasks = n())
    
    # combinar con el conjunto de datos original y calcular el porcentaje de tareas restantes cada semana
    result <- merge(dt, total_tasks, by = "year") %>% 
      mutate(pct.rem = N/total_tasks) %>% 
      select(id.date, N, pct.rem)
    
    # imprimir resultado
    result
    

    La salida debe ser:

         id.date  N     pct.rem
    1: 2019-01-01 80 1.000000000
    2: 2019-01-08 60 0.750000000
    3: 2019-01-15 40 0.500000000
    4: 2019-01-22 40 0.500000000
    5: 2020-01-01 70 1.000000000
    6: 2020-01-08 50 0.714285714
    7: 2020-01-15 40 0.571428571
    8: 2020-01-29 20 0.285714286
    

Comments are closed.