我的数据框只有年度数据,我想创建一个3年期间的总和,按列名NOC、NAICS、Region分组。
| 区域性|NAICS|日期|年份|数值| Value |
| --|--|--|--|--| ------------ |
| 东|AA|二〇一〇年|2010年12月31日|三个| 3 |
| 东|AA|二〇一一年|2011年12月31日|四| 4 |
| 东|AA|二〇一二年|2012年12月31日|0| 0 |
| 西|BB|二〇一〇年|2010年12月31日|一百| 100 |
| 西|BB|二〇一一年|2011年12月31日|两百| 200 |
| 西|BB|二〇一二年|2012年12月31日|两百| 200 |
| 北|CC|二〇一〇年|2010年12月31日|二十三| -23 |
| 北|CC|二〇一一年|2011年12月31日|三个| 3 |
| 北|CC|二〇一一年|2011年12月31日|二十| 20 |
新的df应该看起来像
| 区域性|NAICS|日期|年份|数值|总和| Sum |
| --|--|--|--|--|--| ------------ |
| 东|AA|二〇一〇年|2010年12月31日|三个|七| 7 |
| 东|AA|二〇一一年|2011年12月31日|四|不适用| NA |
| 东|AA|二〇一二年|2012年12月31日|0|不适用| NA |
| 西|BB|二〇一〇年|2010年12月31日|一百|五百| 500 |
| 西|BB|二〇一一年|2011年12月31日|两百|不适用| NA |
| 西|BB|二〇一二年|2012年12月31日|两百|不适用| NA |
| 北|CC|二〇一一年|2010年12月31日|二十三|0| 0 |
| 北|CC|二〇一一年|2011年12月31日|三个|不适用| NA |
| 北|CC|二〇一一年|2011年12月31日|二十|不适用| NA |
我试过这个,但不能让它工作。
df %>%
group_by(NOC, Region, NAICS, Date) %>%
mutate(max = rollapplyr(Value, 1:n() - findInterval(date - 5, Date), sum)) %>%
slice_max(max) %>%
ungroup %>%
字符串
3条答案
按热度按时间a2mppw5e1#
rollapply
函数可以在固定窗口大小下使用,如果您确定时间戳是均匀分布的。字符串
如果时间戳之间的距离不相等,则需要使用带有宽度向量的
rollapply
。这个向量可以按照下面的代码片段中所描述的方法计算,其中findIntervall
查找区间的边界。型
但是,您不会获得
NA
值。要做到这一点,你必须想出一些规则来确定一个三年周期的开始。ldfqzlk82#
单程:
字符串
或者
型
或者使用
rollapply
:型
这些都是假设你有完整的数据(即,数据中没有间隙,并且都是均匀间隔的(即,它不去2011年,2012年,2014年,2014年),它看起来像你的数据不这样做。在这种情况下,这样的话会更合适:
型
然而,这需要接下来三年的值的总和,这不会像您的示例中那样创建一堆NA,因为它只是寻找它可以找到的NA(您可以将其视为积极或消极,这取决于您的观点)。
或者,如果要将数据拆分为离散的3年组:
型
5tmbdcev3#
请尝试下面的代码