10

列に月、行に年を含む 100 年間 (1200 データ ポイント) の月次データのデータ フレームがあります。毎月の時系列に変換したいのですが、いくつかの方法を試しましたが、正しい「時間的」構造を作成する方法はありません。

問題は、データ フレームを 12 変数 (月) の 100 回の観測 (年) と見なす R にあります。これが私の最新の試みの再現可能なコードです:

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」オブジェクトでは、行と列が入れ替わり、列の連続した観測の代わりに、すべての 1 月、2 月などは次々に積み重ねられます。正しい時間構造に到達するにはどうすればよいですか?

私のデータの例: これらは 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  

元の時系列のプロット

そして、この 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  

R コードからの時系列のプロット

--変更された時間構造に注意してください (列の値が行に表示されます..)--

ありがとう。

4

1 に答える 1

9

解決策 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)

解決策 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 

データを溶かして、それぞれが観測を表す 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)
于 2013-04-27T10:50:43.293 に答える