在R中将每周数据框转换为每月数据框

时间:2018-09-03 17:07:39

标签: r

我的数据如下所示,不同的node_desc每周有4年的数据

         ID1     ID2   DATE_     value
1:     00001     436 2014-06-29 175.8164
2:     00001     436 2014-07-06 188.9264
3:     00001     436 2014-07-13 167.5376
4:     00001     436 2014-07-20 160.7907
5:     00001     436 2014-07-27 185.3018
6:     00001     436 2014-08-03 179.5748

想将数据帧转换为每月数据。尝试以下代码

df %>%
  tq_transmute(select     = c(value,ID1),
               mutate_fun = apply.monthly,
               FUN        = mean)

但是我的输出如下所示

DATE_                 value
  <dttm>                <dbl>
1 2014-06-29 00:00:00    144.
2 2014-07-27 00:00:00    143.
3 2014-08-31 00:00:00    143.
4 2014-09-28 00:00:00    152.
5 2014-10-26 00:00:00    156.
6 2014-11-30 00:00:00    166.

但是我想拥有ID1,ID2,Date(每月)和值(获取4周的平均值或最大值),而不是仅仅具有日期和值,因为我有4年不同ID1的数据。有人用R帮助我

2 个答案:

答案 0 :(得分:0)

这是我的主意

dta <- data.frame(id1=rep("00001",6),id2=rep("436",6),
              date_=as.Date(c("29jun2014","6jul2014","13jul2014","20jul2014","27jul2014","3aug2014"),"%d%B%Y"),
              value=c(175.8164,188.9264,167.5376,160.7907,185.3018,179.5748))

剩下的事情由dplyr完成。在这里,我通过取平均值来总结数据

library(dplyr)
my_dta <- dta %>% mutate(month_=format(as.yearmon(date_),"%b"))
my_dta %>% group_by(.dots=c("id1","id2")) %>% summarise(mvalue=mean(value))

答案 1 :(得分:0)

您遇到的问题是您的数据集没有每日数据。 apply.monthly函数来自xts,但是tidyquant围绕许多函数使用包装器,因此它们以更整齐的方式工作。 apply.monthly需要一个xts对象,该对象基本上是具有时间索引的矩阵。

还知道apply.monthly返回时间序列中该月的最后一个可用日期。查看您的示例集,它在2017年7月返回的最后一天是27日。现在,如果您一个月中有5条记录(几周),则均值函数将在5条记录中执行此操作。绝对不会是1个月,因为每周数据永远不会覆盖每月数据。

但是使用tidyquant,如果将结果与原始数据结合在一起,则可以得到ID1和ID2的每月结果。请参见下面的代码。我还没有删除任何不需要的列。

df1 %>%
  tq_transmute(select     = c(value, ID1),
               mutate_fun = apply.monthly,
               FUN        = mean) %>% 
  mutate(DATE_ = as.Date(DATE_)) %>% 
  inner_join(df1, by = "DATE_")

# A tibble: 3 x 5
  DATE_      value.x ID1   ID2   value.y
  <date>       <dbl> <fct> <fct>   <dbl>
1 2014-06-29    176. 00001 436      176.
2 2014-07-27    176. 00001 436      185.
3 2014-08-03    180. 00001 436      180.

数据:

df1 <- data.frame(ID1 = rep("00001", 6),
           ID2 = rep("436", 6),
           DATE_ = as.Date(c("2014-06-29", "2014-07-06", "2014-07-13", "2014-07-20", "2014-07-27", "2014-08-03")),
           value = c(175.8164,188.9264,167.5376,160.7907,185.3018,179.5748)
           )