首页 > 解决方案 > 将列添加到表中,其值取决于日期

问题描述

我有一个表格,其中包含日期作为数字和每个日期的值。现在我想添加另一列weekSum,其中包含上周的价值总和。但是缺少一些日期(所以我不能总是使用当前和最后 6 行)。我的表如下所示:

df <- data.frame('date' = c(20160309, 20160310, 20160311, 20160312, 20160313, 20160314, 20160315, 20160317, 20160318, 20160319, 20160321), 'value' = c(1, 2, 3, 4, 5, 6, 7 ,8, 9, 10, 11))

date        value
20160309     1
20160310     2
20160311     3
20160312     4
20160313     5
20160314     6
20160315     7
20160316     8     
20160318     9     #17th skipped
20160319    10     
20160321    11     #20th skipped

我想得到以下输出:

date        value    weekSum
20160309     1       NA
20160310     2       NA
20160311     3       NA
20160312     4       NA
20160313     5       NA
20160314     6       NA
20160315     7       28    # 1+2+3+4+5+6+7
20160316     8       35    # 2+3+4+5+6+7+8
20160318     9       39    # 4+5+6+7+8+9
20160319    10       45    # 5+6+7+8+9+10
20160321    11       45    # 7+8+9+10+11

如何才能做到这一点?

标签: rsum

解决方案


1)将数据框转换为动物园并定义一个weekSum函数,将其输入子集到上周并将其相加。然后使用rollapplyrwithcoredata = FALSE以便将带有时间的 zoo 对象传递给函数,而不仅仅是核心数据weekSum

library(zoo)

z <- read.zoo(df, format = "%Y%m%d")
weekSum <- function(z) sum(z[time(z) > tail(time(z), 1) - 7])
transform(df, weekSum = rollapplyr(z, 7, weekSum, fill = NA, coredata = FALSE))

给予:

               date value weekSum
2016-03-09 20160309     1      NA
2016-03-10 20160310     2      NA
2016-03-11 20160311     3      NA
2016-03-12 20160312     4      NA
2016-03-13 20160313     5      NA
2016-03-14 20160314     6      NA
2016-03-15 20160315     7      28
2016-03-16 20160316     8      35
2016-03-18 20160318     9      39
2016-03-19 20160319    10      45
2016-03-21 20160321    11      45

2)另一种方法是用零填充缺失日期的值,然后仅使用rollsumr宽度为 7。 z来自 (1)。

z0 <- merge(z, zoo(, seq(start(z), end(z), "day")), fill = 0)
transform(df, weekSum = rollsumr(z0, 7, fill = NA)[z0 != 0])

推荐阅读