R 将相关矩阵转换为每个行-列对记录的数据帧

R 将相关矩阵转换为每个行-列对记录的数据帧,r,matrix,correlation,R,Matrix,Correlation,我有一个大的关联矩阵(1093x1093)。我正在尝试将我的矩阵放入一个数据框中,该数据框中的每一行和每一列对都有一列,因此它将(1093)^2条记录 这是我的矩阵的一个片段 60516 45264 02117 60516 1.00000000 -0.370793012 -0.082897941 45264 -0.37079301 1.000000000 0.005145601 02117 -0.08289794 0.005145601

我有一个大的关联矩阵(1093x1093)。我正在尝试将我的矩阵放入一个数据框中,该数据框中的每一行和每一列对都有一列,因此它将(1093)^2条记录

这是我的矩阵的一个片段

            60516        45264        02117
60516  1.00000000 -0.370793012 -0.082897941
45264 -0.37079301  1.000000000  0.005145601
02117 -0.08289794  0.005145601  1.000000000
这里的目标是创建一个如下所示的数据帧:

row column correlation
60516 60516 1.000000000
60516 45264 -0.370793012
。。。。。。。。等等

有人有什么建议吗?如果我能澄清什么,请告诉我

谢谢,
Ben

对于矩阵
m
,您可以执行以下操作:

data.frame(row=rownames(m)[row(m)], col=colnames(m)[col(m)], corr=c(m))

#     row   col         corr
# 1 60516 60516  1.000000000
# 2 45264 60516 -0.370793010
# 3 02117 60516 -0.082897940
# 4 60516 45264 -0.370793012
# 5 45264 45264  1.000000000
# 6 02117 45264  0.005145601
# 7 60516 02117 -0.082897941
# 8 45264 02117  0.005145601
# 9 02117 02117  1.000000000
但是如果你的矩阵是对称的,如果你对对角线不感兴趣,那么你可以把它简化为:

data.frame(row=rownames(m)[row(m)[upper.tri(m)]], 
           col=colnames(m)[col(m)[upper.tri(m)]], 
           corr=m[upper.tri(m)])

#     row   col         corr
# 1 60516 45264 -0.370793012
# 2 60516 02117 -0.082897941
# 3 45264 02117  0.005145601

以下几点应该行得通。给定一个相关矩阵
Acor

您可以将data.frame创建为:

UpperT <- Acor[upper.tri(Acor, diag = TRUE)]
n <- dim(Acor)[[1]]
Row <- unlist(lapply(seq_len(n), FUN = seq_len))
Column <- rep(seq_len(n), seq_len(n))
Df <- data.frame(UpperT, Row, Column)

用一点tidyverse很容易:

给定相关矩阵
X

X %>% as.data.frame %>% tibble::rownames_to_column() %>% 
    tidyr::pivot_longer(-rowname)

当然,您可以使用
rownames\u-to\u-column
pivot\u-longer
参数更改名称,还可以添加
filter(rowname!=name)
以删除对角关联。

为什么要这样做?我假设你打算用它作为其他东西的输入。如果是这样,我们能解决全部问题吗?嗨@jbaums。假设我的矩阵不是对称的。如何消除数据帧中的相似对或数据帧中的冗余对。i、 e.对于所有x,去除成对
(x,x)
,对于那些已经记录成对
(x,y)
的x,x,x)。有什么建议吗?换句话说,我想要上三角形(不包括对角线)上的数据,而不需要假设对称矩阵。
> Df
       UpperT Row Column
1   1.0000000   1      1
2   0.3398424   1      2
3   1.0000000   2      2
4   0.8876580   1      3
5   0.5897580   2      3
6   1.0000000   3      3
7   0.2582569   1      4
8  -0.7416699   2      4
9  -0.1631381   3      4
10  1.0000000   4      4
11 -0.5699901   1      5
12  0.2502752   2      5
13 -0.2101108   3      5
14 -0.8067492   4      5
15  1.0000000   5      5
X %>% as.data.frame %>% tibble::rownames_to_column() %>% 
    tidyr::pivot_longer(-rowname)