在 R 中重组相关数据

Restructuring correlation data in R

假设我有一个时间序列,在每次迭代中,我都会取其中的固定部分并计算相关矩阵。此外,假设只有三个元素,它们在相关矩阵中用它们的名称表示。我想给它们编号,意思是第一个元素是 1,第二个是 2,依此类推。然后我想以一种扩展这些矩阵的方式拥有一个数据框。例如:

第一个元素是元素“from”,第二个元素是“to”,第三个是相关值,第四个是时间。我可以将时间作为输入并重复两次作为元素。我意识到每个相关值都有重复项,“to”和“from”元素不同,这就是我要找的。我该如何构建它?这是我的数据,其中 g.list 是相关矩阵列表:

> dput(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"
))))

你在找这个吗?

result <- do.call(rbind, Map(function(x, y) 
  cbind(which(x < 1, arr.ind = TRUE), value = x[x != 1], year = y), 
    g.list, 2018:2020))

result

#    row col value year
#gs    2   1 0.352 2018
#ms    3   1 0.802 2018
#jpm   1   2 0.352 2018
#ms    3   2 0.827 2018
#jpm   1   3 0.802 2018
#gs    2   3 0.827 2018
#gs    2   1 0.352 2019
#ms    3   1 0.802 2019
#jpm   1   2 0.352 2019
#ms    3   2 0.827 2019
#jpm   1   3 0.802 2019
#gs    2   3 0.827 2019
#gs    2   1 0.352 2020
#ms    3   1 0.802 2020
#jpm   1   2 0.352 2020
#ms    3   2 0.827 2020
#jpm   1   3 0.802 2020
#gs    2   3 0.827 2020

要仅获取 upper/lower 个三角形值以避免重复,您可以使用 -

do.call(rbind, Map(function(x, y) {
  x[upper.tri(x)] <- 1
  cbind(which(x < 1, arr.ind = TRUE), value = x[x != 1], year = y) 
}, g.list, 2018:2020))