我有一个矩阵,表示一堆相关矩阵随时间的特征值。
我的矩阵有一个列,其中包含时间,但据我所知,它不是时间序列或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
有人能指出我如何最好地解决这个问题吗?
答案 0 :(得分:1)
我认为您需要转换矩阵并转换为data.frame
,然后再将其转换为xts
,这样您就可以将行作为记录(观察),将列作为变量。
> 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"
答案 1 :(得分:1)
as.xts
期望矩阵的rownames
为时间戳。在您的情况下,colnames
eigen
包含时间戳。因此,您需要在调用eigen
之前转置as.xts
。
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
必须将其强制转换回矩阵。