2017-05-24 88 views
1

我有其表示隨着時間的推移一堆相關矩陣的特徵值的矩陣。轉換矩陣回XTS

我的矩陣具有與它引用的時間列,但它不是一個時間序列或XTS,據我可以告訴對象。

最終我希望該矩陣轉換成的格式是它的數據幀或XTS對象,讓我隨時間繪製的N個最大本徵值。

我怎麼能轉換這個矩陣成這樣的格式,我想XTS是可取的,因爲它是一個時間序列的代表性?

我曾嘗試以下,但我不能得到它的工作:

time.index <- as.POSIXct(colnames(eigen)) 
eigenXTS <- as.xts(eigen, order.by = time.index) 

,但我回到指

Error in xts(x, order.by = order.by, frequency = frequency, ...) : 
    NROW(x) must match length(order.by) 

我的數據看起來如下錯誤:

> class(eigen) 
[1] "matrix" 

> str(eigen) 
num [1:12, 1:1334] 4.461 2.292 2.216 1.425 0.839 ... 
- attr(*, "dimnames")=List of 2 
    ..$ : NULL 
    ..$ : chr [1:1334] "2017-01-20 18:45:00" "2017-01-20 19:00:00" "2017-01-20 19:15:00" "2017-01-20 19:30:00" ... 

> dim(eigen) 
[1] 12 1334 

> eigen[1:4,1:4] 
    2017-01-20 18:45:00 2017-01-20 19:00:00 2017-01-20 19:15:00 2017-01-20 19:30:00 
[1,]   4.461059   4.774866   4.658013   4.841987 
[2,]   2.291520   2.330239   2.101630   2.145122 
[3,]   2.215749   2.183941   1.935904   1.861954 
[4,]   1.424662   1.277794   1.750168   1.762004 

任何人都可以點我如何最好的方法解決這個問題的方向是什麼?

回答

1

as.xts預計矩陣的rownames是時間戳。在你的情況下,eigencolnames包含時間戳。因此,你需要在調用as.xts前轉eigen

xeigen <- as.xts(t(eigen)) 
xeigen 
#       [,1]  [,2]  [,3]  [,4] 
# 2017-01-20 18:45:00 4.461059 2.291520 2.215749 1.424662 
# 2017-01-20 19:00:00 4.774866 2.330239 2.183941 1.277794 
# 2017-01-20 19:15:00 4.658013 2.101630 1.935904 1.750168 
# 2017-01-20 19:30:00 4.841987 2.145122 1.861954 1.762004 

由於xts對象只是一個具有時間索引的矩陣,因此不需要強制將矩陣轉換爲data.frame。這樣做意味着as.xts將不得不將其強制回矩陣。

1

我認爲你需要轉置矩陣並將其轉換爲xts所以你可以有行作爲記錄(觀察)和列變量之前轉換爲data.frame

> dput(eigen) 
structure(list(`2017-01-20 18:45:00` = c("4.461059", "2.291520", 
"2.215749", "1.424662"), `2017-01-20 19:00:00` = c("4.774866", 
"2.330239", "2.183941", "1.277794"), `2017-01-20 19:15:00` = c("4.658013", 
"2.101630", "1.935904", "1.750168"), `2017-01-20 19:30:00` = c("4.841987", 
"2.145122", "1.861954", "1.762004")), .Names = c("2017-01-20 18:45:00", 
"2017-01-20 19:00:00", "2017-01-20 19:15:00", "2017-01-20 19:30:00" 
), row.names = c(NA, 4L), class = "data.frame") 

> eigen <- as.data.frame(t(eigen)) 
          V1  V2  V3  V4 
2017-01-20 18:45:00 4.461059 2.291520 2.215749 1.424662 
2017-01-20 19:00:00 4.774866 2.330239 2.183941 1.277794 
2017-01-20 19:15:00 4.658013 2.101630 1.935904 1.750168 
2017-01-20 19:30:00 4.841987 2.145122 1.861954 1.762004 

> xts_eigen <- xts::xts(eigen,order.by = as.POSIXct(rownames(eigen))) 
          V1  V2  V3  V4 
2017-01-20 18:45:00 4.461059 2.291520 2.215749 1.424662 
2017-01-20 19:00:00 4.774866 2.330239 2.183941 1.277794 
2017-01-20 19:15:00 4.658013 2.101630 1.935904 1.750168 
2017-01-20 19:30:00 4.841987 2.145122 1.861954 1.762004 

> class(xts_eigen) 
[1] "xts" "zoo"