Вычислите совокупный процент для каждой единицы измерения по временному ряду

#r #time #cumulative-sum

#r #время #кумулятивная сумма

Вопрос:

У меня есть следующие данные:

 ID <- c(1, 2, 1, 2, 1, 2)
year  <- c(1, 1, 2, 2, 3, 3)
population.served  <- c(100, 200, 300, 400, 400, 500)
population  <- c(1000, 1200, 1000, 1200, 1000, 1200)
all <- data.frame(ID, year, population.served, population)
 

Я хочу рассчитать% обслуживаемого населения для каждого идентификатора по годам. Я пытался это сделать, но мне удается рассчитать только процент обслуживания за каждый год. Мне нужен какой-то способ для перебора каждого идентификатора и года, чтобы получить совокупную сумму в качестве числителя.

Я хочу, чтобы данные выглядели следующим образом:

 ID <- c(1, 2, 1, 2, 1, 2)
year  <- c(1, 1, 2, 2, 3, 3)
population.served  <- c(100, 200, 300, 400, 400, 500)
population  <- c(1000, 1200, 1000, 1200, 1000, 1200)
cumulative.served <- c(10, 16.7, 40, 50, 80, 91.7)
all <- data.frame(ID, year, population.served, population, cumulative.served)
 

Ответ №1:

Это можно легко сделать с dplyr помощью пакета:

 all %>% 
  arrange(year) %>% 
  group_by(ID) %>% 
  mutate(cumulative.served = round(cumsum(population.served)/population*100,1))
 

затем вывод:

      ID  year population.served population cumulative.served
  <dbl> <dbl>             <dbl>      <dbl>             <dbl>
1     1     1               100       1000              10.0
2     2     1               200       1200              16.7
3     1     2               300       1000              40.0
4     2     2               400       1200              50.0
5     1     3               400       1000              80.0
6     2     3               500       1200              91.7
 

Или аналогичным образом с data.table пакетом fast:

 library(data.table)
setDT(all)[order(year), cumulative.served := round(cumsum(population.served)/population*100,1), by = ID]
 

После некоторых проб и ошибок я также разработал базовый подход R.:

 all <- all[order(all$ID, all$year),]
all$cumulative.served <- round(100*with(all, ave(population.served, ID, FUN = cumsum))/all$population, 1)
 

Комментарии:

1. Любой base подход R?

2. Мой подход, основанный на data.table , похоже, столкнулся с вашим. Я удалил свой. Извинения!

3. Что делает ,1 в последней строке кода dplyr?

4. @ThirstforKnowledge здесь указывается количество десятичных знаков для round функции