R语言如何转置xts矩阵且转置后保留xts类格式?
如何转置xts矩阵且保留xts格式
问题原因
原生t()函数仅会转置xts对象的底层数值矩阵,不会同步处理xts特有的时间索引、类属性,因此转置后会退化为普通matrix/array对象。直接调用as.xts()时报错,是因为转置后的矩阵行名为原xts的列名,不属于标准时间格式,函数无法自动解析为合法时间索引。
核心注意:xts作为时间序列对象,强制要求每一行对应一个唯一时间戳,传入的
order.by参数必须是长度等于矩阵行数的时间类型向量(Date/POSIXlt/POSIXct等),无法构造行索引非时间类型的xts对象。
解决步骤
你原xts对象M为700行(对应700个日期索引)、70列,转置后为70行、700列,需要先为这70行匹配对应的合法时间索引,再重新构造xts对象,代码如下:
library(xts) # 1. 提取原xts对象的核心组成部分 core_mat <- coredata(M) # 提取底层数值矩阵,排除xts属性 old_date_index <- index(M) # 提取原700个日期索引 old_col_names <- colnames(M) # 提取原70个列名,即转置后的行维度标识 # 2. 转置数值矩阵,将原日期索引设为转置后矩阵的列名 t_mat <- t(core_mat) colnames(t_mat) <- as.character(old_date_index) # 3. 为转置后的70行数据设置合法时间索引,替换为你实际业务对应的时间向量即可 # 示例为从1970-01-01开始生成连续70天的日期作为占位索引 new_row_index <- seq.Date(from = as.Date("1970-01-01"), by = "day", length.out = nrow(t_mat)) # 4. 构造新的xts对象 TM <- xts(t_mat, order.by = new_row_index) # 验证结果 class(TM) # [1] "xts" "zoo" dim(TM) # [1] 70 700
如果转置后的70行数据本身没有对应的时间属性,只是需要做矩阵运算,不需要强行转换为xts格式,保留普通matrix格式即可,避免后续时间序列相关函数调用出错。
内容的提问来源于stack exchange,提问作者user19003056
相关产品推荐
相关产品推荐

