2013-04-27 81 views
5

我有一个100年(1200个数据点)的月数据的数据框,行和列中的月份在行中。我想将它转换为每月的时间序列,我尝试了几种方法,但都没有创建正确的“时间”结构。将数据帧转换为月度时间序列

问题在于R将数据框视为100个12个变量(月)的观察值(年)。这里是我的最新尝试可重复码:

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) 

在“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 

Plot of original time series

,并通过使用该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) 

这是输出我得到的时间序列对象:

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 

Plot of time series from R code

- 注改变的时间结构(从列中的值现在是在排..) -

感谢。

+0

我编辑了我的答案。我实际上并没有体验到由'plot'显示的数据中的cols和rows之间的“切换”。也许你可以使用你的数据样本,仅仅几年,并发布你得到的图表,得到更好的答案。 – Michele 2013-04-27 10:43:03

+0

我已经添加了我的原始数据和图表,以显示错误的值排序。你的编辑1解决方案给我一个多变量的时间序列,这不是我想要的,我想保留它作为一个单变量系列进一步处理..至于编辑2,我试图as.vector()出于同样的原因,但是导致订购问题的操作。也许@Alexander发布的解决方案#1将工作,我仍然必须尝试.. – avg 2013-04-27 12:37:23

+0

我的编辑1不是一个解决方案......它只是为了了解ts()如何工作。我的编辑2以矢量数据ALREADY开始......我没有意识到你只需要一个转置......'round(seq(5,10,length.out = 24),1)'是一个矢量。 – Michele 2013-04-27 13:07:07

回答

3

溶液1

你可以转置(功能吨())矢量化之前的矩阵:

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) 

溶液2

你可以melt数据,按日期排序,然后应用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 

熔体数据,以便你有1200行,每行代表一个观测的数据帧:

library("reshape2") 
dummy.df <- melt(dummy.df, id.vars = "Year") 

排序按日期的意见:

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

然后,可以应用一个类似的ts()调用,ts对象显示所需的顺序:

dummy.df.ts <- ts(dummy.df$value, start=c(1901,1), end=c(2000,12), frequency=12) 
+0

感谢您的答案。在您发布#1之前,我尝试了#2,它给了我正确的时间序列输出。但我想知道如何在不使用重塑的情况下做到这一点,因为所做的事情本质上是将值排序为列向量,即将原始df中的行从端到端堆叠起来。我早些时候尝试过几次t()操作,但没有结果,但我不认为我试过了你在#1中发布的那个..将让你知道.. – avg 2013-04-27 12:31:56

+0

解决方案1正是我想要的..谢谢! – avg 2013-04-27 12:51:26

相关问题