【问题标题】:How to reshape based on time?如何根据时间重塑?
【发布时间】:2017-01-23 16:29:40
【问题描述】:

我有一个时间序列数据:

  date value
12  2016-08-05   854
13  2016-07-29  1065
14  2016-07-22   878
15  2016-07-15  1145
16  2016-07-08   735
17  2016-07-01   730
18  2016-06-24   726
19  2016-06-17  1011
20  2016-06-10  1019

我想要的是每月数据的矩阵:

Jan Feb March ... (more months)
123 222 555
234 333 555
456 444 666

如何将输入数据重塑为所需的输出?我相信reshape 功能可能会有所帮助,但不确定如何。

【问题讨论】:

    标签: r reshape


    【解决方案1】:

    以下也应该有效:

    df <- read.table(text='date value
                     12  2016-08-05   854
                     13  2016-07-29  1065
                     14  2016-07-22   878
                     15  2016-07-15  1145
                     16  2016-07-08   735
                     17  2016-07-01   730
                     18  2016-06-24   726
                     19  2016-06-17  1011
                     20  2016-06-10  1019
                     21  2015-06-01  225', header=TRUE, stringsAsFactors=FALSE)
    
    library(dplyr)
    library(tidyr)
    df$date <- as.Date(df$date)
    df$month <- format(df$date, '%b')
    df$year <- format(df$date, '%Y')
    df <- df[c('year', 'month',  'value')]
    df %>% group_by(month, year) %>% summarise(value=sum(value)) %>% spread(month, value)
    
    #  year   Aug   Jul   Jun
    #  (chr) (int) (int) (int)
    #1  2015    NA    NA   225
    #2  2016   854  4553  2756
    

    【讨论】:

      【解决方案2】:

      我们通过将“日期”转换为 Date 类来创建“月份”列,format 它提取“月份”,将其转换为 factor 并将 levels 指定为 month.abb 然后dcast 将其转换为“宽”格式

      library(data.table)
      setDT(df1)[, Month := factor(format(as.Date(date), "%b"), levels = month.abb)]
      dcast(df1, rowid(Month)~Month, value.var = "value", drop = FALSE, fill = 0)
      

      或者我们可以这样做tidyverse

      library(dplyr)
      library(tidyr)
       df1 %>% 
          group_by(Month = factor(month.abb[month(date)], levels = month.abb))  %>%
          mutate(ind = row_number()) %>% 
          spread(Month, value, drop = FALSE, fill=0)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多