簡體   English   中英

將時間序列轉換為數據幀並返回

[英]Transforming a time-series into a data frame and back

時間序列的輸出看起來像一個數據幀:

ts(rnorm(12*5, 17, 8), start=c(1981,1), frequency = 12)

       Jan       Feb       Mar       Apr       May       Jun       Jul     ...
1981 14.064085 21.664250 14.800249 -5.773095 16.477470  1.129674 16.747669 ...
1982 23.973620 17.851890 21.387944 28.451552 24.177141 25.212271 19.123179 ...
1983 19.801210 11.523906  8.103132  9.382778  4.614325 21.751529  9.540851 ...
1984 15.394517 21.021790 23.115453 12.685093 -2.209352 28.318686 10.159940 ...
1985 20.708447 13.095117 32.815273  9.393895 19.551045 24.847337 18.703991 ...

將其轉換為具有Jan,Feb,Mar ...列和1981、1982等行的數據框,然后再返回是很方便的。 最優雅的方法是什么?

這有兩種方法。 第一種方法為要創建的矩陣創建暗名,然后將數據串出到矩陣中,進行轉置並將其轉換為數據幀。 第二種方法創建一個由年和月變量組成的by列表,並在之后使用tapply轉換為數據框並添加名稱。

# create test data
set.seed(123)
tt <- ts(rnorm(12*5, 17, 8), start=c(1981,1), frequency = 12)

1)矩陣 此解決方案要求我們連續整整一年

dmn <- list(month.abb, unique(floor(time(tt))))
as.data.frame(t(matrix(tt, 12, dimnames = dmn)))

如果我們不在乎漂亮的名字,那就是as.data.frame(t(matrix(tt, 12)))

我們可以使用@thelatemail的注釋將dmn<-行替換為以下更簡單的行:

dmn <- dimnames(.preformat.ts(tt))

2)輕按 使用tapply更一般的解決方案如下:

Month <-  factor(cycle(tt), levels = 1:12, labels = month.abb)
tapply(tt, list(year = floor(time(tt)), month = Month), c)

注意:假設X是上面的任何一種解決方案,則可以將其取反。 然后嘗試:

ts(c(t(X)), start = 1981, freq = 12)

更新資料

改進來自以下@latemail的評論。

AirPassengers數據集的示例:

使數據可用並檢查其類型:

data(AirPassengers)
class(AirPassengers)

將時間序列轉換為數據幀:

df <- data.frame(AirPassengers, year = trunc(time(AirPassengers)), 
month = month.abb[cycle(AirPassengers)])

重新創建時間序列對象:

tsData = ts(df$AirPassengers, start = c(1949,1), end = c(1960,12), frequency = 12)

繪制結果以確保正確執行:

components.ts = decompose(tsData)
plot(components.ts)

試試“ tsbox”軟件包

ts = ts(rnorm(12*5, 17, 8), start=c(1981,1), frequency = 12) df = ts_df(ts) str(df)

data.frame: 60 obs. of 2 variables: time : Date, format: "1981-01-01" "1981-02-01" value: num 23.15 22.77 5.1 1.05 13.87

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM