我有一个日期列表,每个日期都有一个值。
这是我的数据框现在的样子。请注意,日期中可以有重复项,但值的输入也将以相同的值重复(即第2行和第3行具有相同的日期,但各自的值也相同)。
date value
1 2018-02-08 1
2 2018-02-09 2
3 2018-02-09 2
4 2018-02-10 4
... ...
这就是我想要数据框的样子
date value weekavg
1 2018-02-08 1 ...
2 2018-02-09 2 ...
3 2018-02-09 2 ...
4 2018-02-10 4 ...
5 2018-02-11 0 ...
6 2018-02-12 0 ...
7 2018-02-13 0 ...
8 2018-02-14 0 ...
9 2018-02-15 0 1
... ... ...
为澄清起见,第九行中的条目是通过查找一周前发生的日期来计算的,因此对于2018-02-15而言,其日期范围为2018-02-08至2018-02-13 。因此,由于1 + 2 + 4 + 0 + 0 + 0 + 0 = 7,结果为1。我该如何在R中执行此操作,然后对每一行执行此操作?
------可复制示例-----
数据
lines <- "date value
1 2018-02-08 NA
2 2018-02-08 NA
3 2018-02-09 NA
4 2018-02-10 295
5 2018-02-10 295
6 2018-02-11 329
7 2018-02-12 242
8 2018-02-12 242
9 2018-02-13 317
10 2018-02-14 341
11 2018-02-15 292
12 2018-02-16 363
13 2018-02-17 380
14 2018-02-18 319
15 2018-02-19 307
16 2018-02-20 328
17 2018-02-21 290"
df <- read.table(text = lines)
newDF <- merge(df, transform(unique(df), mean = rollmeanr(value, 7, fill = NA)))
平均值列对我而言只是NA。
P.S。对于图片评论的道歉,我不知道。非常感谢您的帮助。
答案 0 :(得分:1)
该问题并未完全定义输出,而是假设:
然后:
library(zoo)
merge(DF, transform(unique(DF), mean = rollmeanr(value, 7, fill = NA)))
对于注释末尾可重复显示的示例数据,给出:
date value mean
1 2018-02-08 1 NA
2 2018-02-09 2 NA
3 2018-02-09 2 NA
4 2018-02-10 4 NA
5 2018-02-11 0 NA
6 2018-02-12 0 NA
7 2018-02-13 0 NA
8 2018-02-14 0 1.0000000
9 2018-02-15 0 0.8571429
Lines <- "
date value
1 2018-02-08 1
2 2018-02-09 2
3 2018-02-09 2
4 2018-02-10 4
5 2018-02-11 0
6 2018-02-12 0
7 2018-02-13 0
8 2018-02-14 0
9 2018-02-15 0
"
DF <- read.table(text = Lines)