2013-04-27 15 views
5

私は100年(1200データポイント)の月データと月の列と年のデータフレームを持っています。私はそれを毎月の時系列に変換したいと思っています。私はいくつかの方法を試しましたが、どちらも正しい「時間的」な構造を作りませんでした。データフレームを毎月の時系列に変換する

問題は、データフレームを12の変数(月)の100の観測値(年)とみなしてRにあります。ここに私の最新の試みのための再現性のあるコードです:「dummy.df.ts」で

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) 

は、オブジェクト、行と列が列にシーケンシャル観測の代わりに切り替えるとしている、などのすべてのjanuarysのfebruarysが一緒に積層されます1つずつどのようにして正しい時間構造を得ることができますか?

fr.monthly.temp.sample.ts <- ts(as.vector(as.matrix(fr.monthly.temp.sample)),        start=c(1901,1), end=c(1905,12), frequency=12) 

これがある: - :

私のデータの一例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()呼び出しを使用して、これらは1901年から毎月の温度値は、出力私は時系列オブジェクトのために得る:

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

--Note変更時間構造(列の値が行になりました...) -

感謝。

+0

私は自分の答えを編集しました。私は実際には 'plot'で表示されるデータのcolとrowの間でこの"切り替え "を経験しません。たぶん2年ほど前のデータサンプルを使ってより良い回答を得ることができます。 – Michele

+0

オリジナルのデータとプロットを追加して、値の順序が正しくないことを示しました。あなたのEDIT 1の解決策は私に私が望むものではない多変量の時系列を与えます、私はさらなる処理のための単変量シリーズとしてそれを保持したいと思います。EDIT 2のために、私は同じ理由でas.vector()発注の問題を引き起こしている操作です。おそらく@Alexanderによって投稿された解決策#1が動作するでしょう、私はまだそれを試しなければなりません.. – avg

+0

私の編集1は解決策ではありませんでした...それはちょうどts()の仕組みを認識することでした。私の編集2は、ベクトルの中のデータが既に存在することから始まりました...私はあなたがトランスポーズを必要としていることに気付きませんでした... 'round(seq(5,10、length.out = 24)、1)'はベクトル。答えのために – Michele

答えて

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()操作を2回試しましたが、#1で投稿したものを試したとは思いません。 – avg

+0

解決策1が正確に何をしているのですか.thanks! – avg

関連する問題