如何根据时间重塑?

时间:2017-01-23 16:29:41

标签: r reshape

我有时间序列数据:

  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函数可能会有所帮助,但不确定如何。

2 个答案:

答案 0 :(得分:2)

以下内容也应该有效:

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

答案 1 :(得分:1)

我们通过将“日期”转换为Date类来创建“月份”列,format将其转换为“月份”,并使用{{1}将其转换为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