我有时间序列数据:
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
函数可能会有所帮助,但不确定如何。
答案 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