R 按唯一日期移动平均,每个日期有多个观测值

R 按唯一日期移动平均,每个日期有多个观测值,r,dplyr,moving-average,R,Dplyr,Moving Average,我有一个数据集,每个日期可能包含多个观察值。因此,在date1上可能有5次观察,在date2上有2次观察,在group3上有1次观察 我想按日期计算移动平均数,重要的是,不汇总/减少行数。在上面这个例子中,我仍然有8行数据,在它旁边的一列中,我会有该日期的滚动平均价格,我发现这很有挑战性,因为当我使用ZOO软件包中的典型滚动函数时,它会逐行滚动,我不知道如何让它按日期跳过 例如,第一步通常是: df %>% groupy_by(DATE) %>% summarise(mean

我有一个数据集,每个日期可能包含多个观察值。因此,在date1上可能有5次观察,在date2上有2次观察,在group3上有1次观察

我想按日期计算移动平均数,重要的是,不汇总/减少行数。在上面这个例子中,我仍然有8行数据,在它旁边的一列中,我会有该日期的滚动平均价格,我发现这很有挑战性,因为当我使用ZOO软件包中的典型滚动函数时,它会逐行滚动,我不知道如何让它按日期跳过

例如,第一步通常是:

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