多年来选定月份的R cumsum

时间:2014-02-26 12:18:49

标签: r subset xts week-number cumsum

我想根据中心疾病控制定义计算累积和。 自2008年至今,我每周都有25个区的数据。

          Site1   Site2    Site3  Site4  Site5   Site6   Site7   Site8   Site9
2011-45 1   1   1   1   2   2   1   1   1
2011-46 1   1   1   1   1   2   1   2   3
2011-47 2   1   1   1   1   3   1   2   1
2011-48 1   1   1   1   2   2   3   2   1
2011-49 1   1   1   1   1   2   1   3   2
2011-50 1   1   1   1   1   4   1   1   1
2011-51 1   1   1   1   1   1   1   1   1
2011-52 1   1   1   1   1   2   2   2   2
2012-01 1   1   1   3   2   4   1   1   1
2012-02 1   1   2   1   1   2   1   3   3
2012-03 1   2   1   1   1   2   1   1   2
2012-04 3   1   2   1   1   3   1   2   1
2012-05 1   1   2   1   1   2   1   2   2
2012-06 3   1   2   1   1   5   1   2   2
2012-07 1   1   1   1   1   2   NA  2   1
2012-08 1   2   6   1   1   4   1   4   2
2012-09 3   1   2   1   1   1   1   4   2
…   …   …   …   …   …   …   …   …   …
…   …   …   …   …   …   …   …   …   …
…   …   …   …   …   …   …   …   …   …
2012-45 7   2   1   NA  1   22  NA  17  1
2012-46 4   1   NA  1   1   13  NA  7   1
2012-47 2   1   1   1   1   39  1   12  1
2012-48 4   1   2   NA  1   24  1   8   1
2012-49 1   1   1   1   1   19  1   5   1
2012-50 2   1   2   1   2   17  2   1   2
2012-51 7   1   1   1   1   21  1   3   1
2012-52 1   1   2   1   1   5   1   11  1
2012-53 NA  NA  NA  NA  NA  NA  1   NA  NA
2013-00 6   1   1   1   1   11  1   6   1
2013-01 7   2   3   1   1   58  1   18  2
2013-02 3   2   2   1   3   53  1   27  2
2013-03 1   2   2   1   1   21  1   9   1
2013-04 2   1   1   1   1   14  1   6   3
2013-05 3   1   1   1   1   10  1   3   1
2013-06 NA  2   3   1   1   16  1   8   1
2013-07 16  1   4   1   1   22  1   8   3
2013-08 10  2   6   1   1   19  1   11  1
2013-09 13  1   3   1   2   31  1   7   1
…   …   …   …   …   …   …   …   …   …
…   …   …   …   …   …   …   …   …   …
…   …   …   …   …   …   …   …   …   …
2013-45 2   1   1   1   1   15  NA  6   1
2013-46 2   2   1   1   1   5   1   2   1
2013-47 3   1   1   1   2   12  1   2   1
2013-48 3   1   1   1   1   2   2   1   1
2013-49 1   2   1   1   1   7   1   NA  2
2013-50 2   2   1   1   1   1   1   1   1
2013-51 NA  1   1   1   1   8   1   2   1
2013-52 NA  2   1   1   1   4   1   2   1
2014-00 NA  1   1   1   1   4   1   1   1
2014-01 NA  2   3   1   1   3   1   1   1
2014-02 NA  3   1   1   2   6   1   1   2
2014-03 NA  1   1   1   1   3   1   1   2
2014-04 NA  1   1   1   1   3   1   1   2
2014-05 1   2   1   1   1   1   1   1   1
2014-06 1   2   1   1   1   1   1   1   1
2014-07 1   2   1   1   1   1   1   1   1
2014-08 1   2   1   1   1   1   1   1   1
2014-09 1   2   1   1   1   1   1   1   1

计算累积和; 我想总结一下:

[(2014-07 + 2014-08 + 2014-09)+(2013-07 + 2013-08 + 2013-09)+...for X year] /weeks number                                 
                                        +

[(2014-08 + 2014-09 + 2014-10)+(2013-08 + 2013-09 + 2013-10)+...for X year] /week number                                  
                                        +

[(2014-09 + 2014-10 + 2014-11)+(2013-09 + 2013-10 + 2013-11)+...for X year] /weeks number 

                                        +

[(2014-10 + 2014-11 + 2014-12)+(2013-10 + 2013-11 + 2013-12)+...for X year] /weeks number

谢谢!

1 个答案:

答案 0 :(得分:0)

  • 您希望在多年内为选定的月份执行cumsum。我们不需要知道从哪里剔除数据的血腥细节。请给我们一个数据框。

  • 首先,您需要将 年,月 分离到新的单独列中(如果您愿意,也可以保留日期)。您可以使用substr(),因为您有固定的日期字符串格式,或者使用函数来计算日期类型的月份(只搜索SO)。这取决于你。

  • strsplit方法是:

    df $ Year< - df $ Month< - NA //对于悲观主义,如果我们在字符串中有一些错过的月份 df $ Year< - substr(df $ Date,1,4) df $ Week< - substr(df $ Date,6,7) //您可以将Year,Week视为整数,或转换为factor,无论是什么使您的后续工作制表和绘图更容易。如果您希望Month表示为'00','01',则使用因子与字符串级别或字符串。或者在打印时使用format / printf。

  • (PS你的数据有周数00..53,似乎你有一些星期开始/年末。仔细检查这个条目,也许你想放弃2012-53段:

    2012-53 NA NA NA NA NA NA 1 NA NA 2013-00 6 1 1 1 1 11 1 6 1

  • 然后使用逻辑索引,subset()dplyr::filter(或plyr::ddply)感兴趣的月份。您的逻辑表达式为 Month %in% c(7,8,9) ,或 Month>=7 & Month <=9

    < / LI>
  • 当你说“为X年”时,你的意思是'过去所有年份'还是'对于某些可参数化的年份子集'?请编辑以澄清。

  • Month>=7 & Month <=9 这样的表达式要求您使用支持数字比较的日期类型,而不仅仅是dumb'=='。 (我建议无论如何,因为当它通常在x轴上理解日期时间类型时,绘图表现得更好)

  • 然后做逐列的cumsum。 dplyr::summarizelapplycolwise(cumsum)(col-of-interest)

  • 我认为你想要在这个数据框底部的新行'Cumsum'中的所有cumsums?或者,如果它不是数据框,请简化您的生活并使其成为数据框,这样您就可以添加一个带有Rowname“Cumsum”的底行。
  • 完成。我推荐dplyr(现在最活跃的开发和最高性能的库,如果你进展到更难的东西,你的代码将是非常可扩展的),但是对于这个相当简单的任务来说,这可能是过度的,这取决于你。