#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
функции