R语言相关系数矩阵列表重构为含时间、起止节点长数据框的实现方法
R 实现相关系数矩阵列表到指定结构 DataFrame 的转换
实现逻辑
- 首先按照矩阵行名的顺序生成标的到编号的映射:
jpm=1、gs=2、ms=3 - 遍历每个相关系数矩阵,直接全量展开矩阵元素(保留对称重复项,无需取三角区)
- 每个矩阵对应生成
from编号、to编号、相关系数值、对应时间标识四列数据 - 合并所有矩阵的处理结果得到最终数据集
完整代码
# 1. 构造你提供的输入数据(可直接运行) g.list <- list(structure(c(1, 0.352209944821856, 0.802051885793422, 0.352209944821857, 1, 0.827370298950111, 0.802051885793422, 0.827370298950111, 1 ), .Dim = c(3L, 3L), .Dimnames = list(c("jpm", "gs", "ms"), c("jpm", "gs", "ms"))), structure(c(1, 0.670163753398499, 0.753168359152204, 0.6701637533985, 1, 0, 0.753168359152202, 0, 1), .Dim = c(3L, 3L), .Dimnames = list(c("jpm", "gs", "ms"), c("jpm", "gs", "ms" ))), structure(c(1, 0.681190013681026, 0.153608963486821, 0.681190013681026, 1, 0.82058156983829, 0.153608963486822, 0.82058156983829, 1), .Dim = c(3L, 3L), .Dimnames = list(c("jpm", "gs", "ms"), c("jpm", "gs", "ms" )))) # 2. 生成标的编号映射,严格匹配矩阵行名顺序 ticker_names <- rownames(g.list[[1]]) ticker_id <- setNames(seq_along(ticker_names), ticker_names) # 3. 自定义时间标识,可替换为你实际的时间向量,长度和g.list一致即可 time_labels <- seq_along(g.list) # 示例用1、2、3作为三个窗口的时间标识 # 4. 遍历处理所有矩阵,合并结果 result <- do.call(rbind, lapply(seq_along(g.list), function(i) { mat <- g.list[[i]] n <- nrow(mat) # 生成全量from、to编号,保留对称项 from <- rep(seq_len(n), each = n) to <- rep(seq_len(n), times = n) # 拉平矩阵取相关系数 corr_value <- as.vector(mat) # 生成当前窗口的数据集 data.frame( from = from, to = to, corr = corr_value, time = time_labels[i] ) }))
结果验证
查看前6行数据,可以看到对称的1→2和2→1记录都被保留:
head(result)
输出示例:
from to corr time 1 1 1 1.0000000 1 2 1 2 0.3522099 1 3 1 3 0.8020519 1 4 2 1 0.3522099 1 5 2 2 1.0000000 1 6 2 3 0.8273703 1
内容的提问来源于stack exchange,提问作者statwoman
相关产品推荐
相关产品推荐

