r - 将列添加到表中,其值取决于日期
问题描述
我有一个表格,其中包含日期作为数字和每个日期的值。现在我想添加另一列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
如何才能做到这一点?
解决方案
1)将数据框转换为动物园并定义一个weekSum
函数,将其输入子集到上周并将其相加。然后使用rollapplyr
withcoredata = 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])
推荐阅读
- java - 在 Canvas() 构造函数中创建空画布时出现 Java 错误
- javascript - 为浏览器 JavaScript 构建 AWS SDK JavaScript 版本 3 库时遇到问题
- botframework - UpdateActivity 抛出 400“未知活动类型”
- flutter - 如何结合 2 Stream
>> Dart/Flutter 中的类型变量? - java - 调整 JFrame 大小时自动调整 JButton 大小
- angular - 当我尝试从另一个类触发方法时,ViewChild 未定义
- flutter - 滚动条 + 网页滚动时出现的任何滚动小部件错误
- python - 使用 cross_val_score 通过交叉验证计算均方误差的函数
- python - Python 3 中的跳线
- typescript - 从打字稿中的工厂接口中选择类方法