2017-07-07 2 views
0
ID Year Firm Score 

1 2005 A 2 
1 2006 A 5 
1 2006 B 1 
1 2007 A 36 
1 2007 E 69 
1 2008 E 8 
1 2008 B 54 
1 2009 A 25 
1 2009 C 2 
1 2010 E 2 
1 2010 B 2 
1 2011 A 5 
1 2011 B 5 
1 2012 A 4 
1 2012 B 1 

DataConditional Roll Sum (Rollender-Durchschnitt) in R

In obigen Daten möchte ich Gruppe von 5 Jahre auszuführen, für jeden einzelnen (ID) Summe von 'Score' Roll abhängig laufenden Jahr Firm die Person arbeitet in. Lassen Sie mich das mit einem Beispiel erklären. Angenommen, ich möchte die Summe der Variablen "Score" für das Jahr 2009 rollen, sollte sie zuerst die Firmen überprüfen, in denen die Person (ID) arbeitet. Im Jahr 2009 arbeitet die Person in A und C. Sie sollte dann die rollierende 5-Jahres-Summe von "Score" nur für die Firmen A oder C berechnen. Die 5-jährige rollierende Summe für das Jahr 2009 wird (2 (für das Jahr 2005 Firma A) sein. + 5 ((für das Jahr 2006, Firma A)) + 36 (für das Jahr 2007, Firma A) + 27 (für das Jahr 2009, Firma A und C)) = 70. [Hinweis: Das Jahr 2008 wird ignoriert, da die Person weder in der Firma A registriert ist noch Firma C]

Ich möchte Rolling Average auf ähnlichen Linien auch durchführen. [Anmerkung: Originaldaten hat rund 30 Millionen Beobachtungen]

+0

Bild von Daten können gefunden unter https://i.stack.imgur.com/CyWL0.png –

+1

Check out 'zoo :: rollappl y' – Mako212

+1

Sie sollten eine Probe Ihrer Daten 'dput()' –

Antwort

1

einrichten Datenrahmen

rs <- as.data.frame(matrix(nrow =15, ncol = 4)) 

colnames(rs) <- c("ID", "Year", "Firm", "Score") 

rs$ID <- 1 
rs$Year <- c(2005, 
      2006, 
      2006, 
      2007, 
      2007, 
      2008, 
      2008, 
      2009, 
      2009, 
      2010, 
      2010, 
      2011, 
      2011, 
      2012, 
      2012) 

rs$Firm <- c("A", "A", "B", "A", "E", 
      "E", "B", "A", "C", "E", 
      "B", "A", "B", "A", "B") 

rs$Score <- c(2, 5, 1, 36, 69, 8, 
       54, 25, 2, 2, 2, 5, 5, 4, 
       1) 

Schleife über einzigartige Jahre

a <- rs$Year 

for(i in unique(a)){ 

    b <- rs[rs$Year == i,] 
    c <- (b$Firm) 
    d <- rs[rs$Year <= i & rs$Firm %in% c,] 
    print(paste(i, sum(d$Score))) 

} 

Ausgang:

[1] "2005 2" 
[1] "2006 8" 
[1] "2007 112" 
[1] "2008 132" 
[1] "2009 70" 
[1] "2010 136" 
[1] "2011 135" 
[1] "2012 140" 
+0

Danke für die Antwort. Meine ursprünglichen Daten haben 30 Millionen Datensätze. Ich denke, für die Schleife wird sehr teuer sein. Kann etwas dieser Art mit data.table() library durchgeführt werden? –

+0

Auch d <- rs [rs $ Jahr <= i & rs $ Firm% in% c & rs $ Jahr> = i-5,] für 5 Jahre rollende Summe. Für 2012, rollende Summe = 96 –