avg*_*avg 8 r time-series dataframe
我有一个100个月(1200个数据点)的月度数据的数据框,其中行和列中的月数.我想将它转换为月度时间序列,我尝试了几种方法,其中没有一种方法可以创建正确的"时间"结构.
问题在于R将数据框架视为12个变量(月份)的100个观测值(年).这是我最新尝试的可重现代码:
set.seed(12)
dummy.df <- as.data.frame(matrix(round(rnorm(1200),digits=2),nrow=100,ncol=12))
rownames(dummy.df) <- seq(from=1901, to=2000)
colnames(dummy.df) <- c("jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec")
dummy.df.ts <- ts(as.vector(as.matrix(dummy.df)), start=c(1901,1), end=c(2000,12), frequency=12)
Run Code Online (Sandbox Code Playgroud)
在"dummy.df.ts"对象中,行和列被切换,而不是按列顺序观察,所有januarys februarys等一个接一个地堆叠在一起.我怎样才能找到正确的时间结构?
我的数据的一个例子:这些是1901年至1905年的月度温度值
fr.monthly.temp.sample
JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC
1901 2.7 0.4 4.7 10.0 13.0 16.9 19.2 18.3 15.7 10.6 4.9 3.5
1902 4.1 3.2 7.5 10.3 10.0 15.1 18.2 17.4 15.0 10.2 6.3 3.5
1903 3.8 5.9 7.6 7.1 12.9 14.9 17.6 17.3 15.5 12.1 6.9 2.7
1904 3.0 4.6 5.5 10.3 13.6 16.3 20.2 18.5 13.9 11.2 5.4 4.8
1905 1.7 4.0 7.4 9.3 11.9 16.5 20.0 17.6 14.7 8.4 5.5 3.8
Run Code Online (Sandbox Code Playgroud)

并通过使用此ts()调用:
fr.monthly.temp.sample.ts <- ts(as.vector(as.matrix(fr.monthly.temp.sample)), start=c(1901,1), end=c(1905,12), frequency=12)
Run Code Online (Sandbox Code Playgroud)
这是我为时间序列对象获得的输出:
fr.monthly.temp.sample.ts
Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
1901 2.7 4.1 3.8 3.0 1.7 0.4 3.2 5.9 4.6 4.0 4.7 7.5
1902 7.6 5.5 7.4 10.0 10.3 7.1 10.3 9.3 13.0 10.0 12.9 13.6
1903 11.9 16.9 15.1 14.9 16.3 16.5 19.2 18.2 17.6 20.2 20.0 18.3
1904 17.4 17.3 18.5 17.6 15.7 15.0 15.5 13.9 14.7 10.6 10.2 12.1
1905 11.2 8.4 4.9 6.3 6.9 5.4 5.5 3.5 3.5 2.7 4.8 3.8
Run Code Online (Sandbox Code Playgroud)

- 注意更改的时间结构(列中的值现在在行中..) -
谢谢.
解决方案1
您可以在向量化之前转置(函数t())矩阵:
set.seed(12)
dummy.df <- as.data.frame(matrix(round(rnorm(1200), digits = 2),
nrow = 100, ncol = 12))
rownames(dummy.df) <- seq(1901, 2000)
colnames(dummy.df) <- month.abb
dummy.df.ts <- ts(as.vector(t(as.matrix(dummy.df))),
start=c(1901,1), end=c(2000,12), frequency=12)
Run Code Online (Sandbox Code Playgroud)
解决方案2
您可以熔化数据,按日期排序,然后应用ts()函数.
这是数据设置.如果您的语言设置是英语,则可以使用month.abb保存一些代码,但这对其他语言区域设置不健壮.
set.seed(12)
dummy.df <- as.data.frame(matrix(round(rnorm(1200),digits=2),nrow=100,ncol=12))
months <- format(seq.Date(as.Date("2013-01-01"), as.Date("2013-12-01"),
by = "month"), format = "%b")
colnames(dummy.df) <- months
dummy.df$Year <- seq(1901, 2000) # set as variable, not as rownames
Run Code Online (Sandbox Code Playgroud)
融化数据,使您拥有一个包含1200行的数据框,每行代表一次观察:
library("reshape2")
dummy.df <- melt(dummy.df, id.vars = "Year")
Run Code Online (Sandbox Code Playgroud)
按日期订购观察结果:
dummy.df$Date <- as.Date(paste(dummy.df$Year, dummy.df$variable, "01", sep = "-"),
format = ("%Y-%b-%d"))
dummy.df <- dummy.df[order(dummy.df$Date), ]
Run Code Online (Sandbox Code Playgroud)
然后你可以应用一个类似的ts()调用,ts对象显示所需的顺序:
dummy.df.ts <- ts(dummy.df$value, start=c(1901,1), end=c(2000,12), frequency=12)
Run Code Online (Sandbox Code Playgroud)