R 按唯一日期移动平均,每个日期有多个观测值
我有一个数据集,每个日期可能包含多个观察值。因此,在date1上可能有5次观察,在date2上有2次观察,在group3上有1次观察 我想按日期计算移动平均数,重要的是,不汇总/减少行数。在上面这个例子中,我仍然有8行数据,在它旁边的一列中,我会有该日期的滚动平均价格,我发现这很有挑战性,因为当我使用ZOO软件包中的典型滚动函数时,它会逐行滚动,我不知道如何让它按日期跳过 例如,第一步通常是:R 按唯一日期移动平均,每个日期有多个观测值,r,dplyr,moving-average,R,Dplyr,Moving Average,我有一个数据集,每个日期可能包含多个观察值。因此,在date1上可能有5次观察,在date2上有2次观察,在group3上有1次观察 我想按日期计算移动平均数,重要的是,不汇总/减少行数。在上面这个例子中,我仍然有8行数据,在它旁边的一列中,我会有该日期的滚动平均价格,我发现这很有挑战性,因为当我使用ZOO软件包中的典型滚动函数时,它会逐行滚动,我不知道如何让它按日期跳过 例如,第一步通常是: df %>% groupy_by(DATE) %>% summarise(mean
df %>%
groupy_by(DATE) %>%
summarise(mean_daily_price = mean(price)) %>%
ungroup() %>%
arrange(Date) %>%
mutate( ra = rollapply(price, 2, mean, partial=T)
---但是总结让我失去了争吵
library(dplyr)
library(zoo)
DF = structure(list(Date = c("Jan-13", "Jan-13", "Jan-13", "Jan-13", "Jan-13", "Jul-14", "Jul-14", "Oct-16"), Price = c(100L, 200L, 300L, 1000L, 400L, 150L, 50L, 600L), Average.by.Date = c(400L, 400L, 400L, 400L, 400L, 100L, 100L, 600L), Moving_Average_Size_2 = c(NA, NA, NA, NA, NA, 250L, 250L, 350L)), .Names = c("Date", "Price", "Average.by.Date", "Moving_Average_Size_2"), class = "data.frame", row.names = c(NA,
-8L))
在下面的代码中,我们使用
mutate
而不是summary
来添加mean_daily_price
,以便保留数据框的所有行。然后,在最后的mutate
中,我们仅对mean_daily_price
的唯一值运行rollappy
,然后使用table
和rep
按每个日期的行数重复rollappy
的输出
DF %>%
arrange(Date) %>%
group_by(Date) %>%
mutate(mean_daily_price = mean(Price)) %>%
ungroup() %>%
mutate(ra = rep(rollapply(unique(mean_daily_price), 2, mean, fill=NA, align="right"),
table(Date)[order(unique(Date))]))
我认为,最安全的方法需要分两步进行——按Date
计算滚动平均值,然后将它们重新合并(仍然使用dplyr
)
我在对另一个答案的评论中看到,您不认为第一个ra
应该是250——如果是这样,请将调用中的计算更改为rollply
。目前,它的行为似乎符合预期/记录。因此,如果你想要一些不同的东西,你需要解释你想要的改变(可能是一个单独的问题)
另一个警告,对于其他偶然发现这一点的读者来说尤其重要:当前的方法将连续日期条目视为等距,而不管它们实际上相距有多远。如果这能满足你的需要,那太好了。但是,在许多用例中,您可能需要注意测量之间的实际时间量
同样,目前的方法失去了关于所测量的数据的所有信息,可能值得考虑的是通过观察次数来衡量权重(除非你很高兴相信每一天的计算平均值)。
你的问题有点不清楚。你的预期产出是多少?“按日期跳过”是什么意思?请确保代码中的变量名与数据框中的变量名匹配,并且代码中没有任何其他打字错误。抱歉,这不正确。移动平均值大小2是这里的正确答案(或者零值可以=400)——这里不太关心,因为此时只有一个观测日期。此外,也许我遗漏了一些东西,但唯一的(平均每日价格)-如果我在多个日期有相同的平均价格怎么办?除了单独的left\u-join
,你还可以将right\u-join(DF)
添加到链中。尝试rollappyr
代替rollappy
。另外,如果左连接写为left\u-join(x=DF)
,则可以将其添加到管道的末尾。@eipi10和@G Grothendieck都是正确的,可以将调用(无论是left\u-join
还是right\u-join
)添加到管道/链的末尾。我把它们分开放在这里是为了强调,*\u join
是答案中唯一的部分(问题的结构可以被认为是正确的,只是第一步)。
Date Price Average.by.Date Moving_Average_Size_2 mean_daily_price ra
1 Jan-13 100 400 NA 400 NA
2 Jan-13 200 400 NA 400 NA
3 Jan-13 300 400 NA 400 NA
4 Jan-13 1000 400 NA 400 NA
5 Jan-13 400 400 NA 400 NA
6 Jul-14 150 100 250 100 250
7 Jul-14 50 100 250 100 250
8 Oct-16 600 600 350 600 350
rolledAvg <-
DF %>%
group_by(Date) %>%
summarise(mean_daily_price = mean(Price)) %>%
ungroup() %>%
arrange(Date) %>%
mutate( ra = rollapply(mean_daily_price
, 2
, mean
, partial=T
, fill = NA))
left_join(DF, rolledAvg)
Date Price Average.by.Date Moving_Average_Size_2 mean_daily_price ra
1 Jan-13 100 400 NA 400 250
2 Jan-13 200 400 NA 400 250
3 Jan-13 300 400 NA 400 250
4 Jan-13 1000 400 NA 400 250
5 Jan-13 400 400 NA 400 250
6 Jul-14 150 100 250 100 350
7 Jul-14 50 100 250 100 350
8 Oct-16 600 600 350 600 600