2016-10-16 1 views
1

Ich habe folgende Daten:Berechnen kumulativer Prozentsatz für jede Einheit über eine Zeitreihe

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) 

Ich möchte, dass die% der Bevölkerung berechnen für jeden ID für Jahr serviert. Ich habe das versucht, aber ich kann nur das pro Jahr geleistete% berechnen. Ich brauche einen Weg, um jede ID und jedes Jahr zu durchlaufen, um die kumulative Summe als Zähler zu erfassen.

Ich möchte die Daten wie folgt aussehen:

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) 

Antwort

5

Dies kann leicht mit dem dplyr Paket erfolgen:

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

der Ausgang ist dann:

 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 

Or in ähnlicher Weise mit dem schnellen data.table Paket:

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

Nach einigem Versuch und Irrtum, ich heraus auch einen Basis R-Ansatz:

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

All 'base' R Ansatz? – 989

+1

@ m0h3n hinzugefügt :-) – h3rm4n

+0

Mein Ansatz basierend auf 'data.table' scheint mit Ihrem kollidiert zu sein. Ich habe meine gelöscht. Entschuldigung! –

Verwandte Themen