R

时间:2017-07-07 21:10:43

标签: r data-analysis rolling-sum

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

Data

在上面的数据中,我想按照'分数'对于每个人(ID),以当前年份为条件确定该人员的工作。 让我举例解释一下。假设我想要得分'分数'对于2009年的变量,它应该首先检查人(ID)工作的公司。在2009年,人在A和C工作。然后应该计算5年滚动总和的分数'仅适用于A公司或C公司。2009年5年滚动金额的输出将为(2(2005年公司A)+ 5((2006年公司A))+ 36(2007年公司A)+ 27(对于2009年公司A和C))= 70. [注:2008年被忽略,因为人既没有在公司A或公司C注册]

我也希望在类似的线上执行滚动平均线。 [注:原始数据有大约3000万次观测]

1 个答案:

答案 0 :(得分:1)

设置数据框

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)

循环独特年份

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)))

}

输出:

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