2013-04-27 77 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

相關問題