【问题标题】:Convert weekly Data frame to monthly data frame in R在R中将每周数据框转换为每月数据框
【发布时间】:2018-09-03 17:07:39
【问题描述】:

我的数据如下所示,不同的 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(monthly) 和 value(获得 4 周的平均值或最大值) 而不是只有日期和值,因为我有 4 年不同 ID1 的数据。可以有人在R中帮助我

【问题讨论】:

  • 月长于 4 周。您需要定义如何处理重叠和“重叠”。你想要的分组也是模棱两可的。
  • 我希望输出中的值(月均值)和日期(月的最后一天)、ID1、ID2 列对数据集进行一些分析。
  • 您的数据集不支持您的请求。

标签: r


【解决方案1】:

这是我的看法

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))

【讨论】:

    【解决方案2】:

    您遇到的问题是您的数据集没有每日数据。 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)
               )
    

    【讨论】:

      猜你喜欢
      • 2013-05-02
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 2020-06-13
      • 1970-01-01
      • 1970-01-01
      • 2016-10-27
      • 1970-01-01
      相关资源
      最近更新 更多