将关联矩阵转换为包含每个行列对的记录的数据框

时间:2015-01-19 23:00:27

标签: r matrix correlation

我有一个很大的相关矩阵(1093 x 1093)。我正在尝试将我的矩阵变成一个数据帧,每个行和列对都有一列,所以它会(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

........等等。

任何人有任何提示吗?让我知道我是否可以澄清任何事情

谢谢, 本

3 个答案:

答案 0 :(得分:11)

对于矩阵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

答案 1 :(得分:1)

有点整洁很容易:

给出了相关矩阵X

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

您当然可以使用rownames_to_columnpivot_longer参数来更改名称,还可以添加filter(rowname != name)来删除对角线相关性。

答案 2 :(得分:0)

以下内容应该有效。给定相关矩阵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)

例如,使用相关矩阵:

set.seed(24)
A <- matrix(rnorm(25, 5, 2), ncol = 5)
Acor <- cor(A)

> Acor
           [,1]       [,2]       [,3]       [,4]       [,5]
[1,]  1.0000000  0.3398424  0.8876580  0.2582569 -0.5699901
[2,]  0.3398424  1.0000000  0.5897580 -0.7416699  0.2502752
[3,]  0.8876580  0.5897580  1.0000000 -0.1631381 -0.2101108
[4,]  0.2582569 -0.7416699 -0.1631381  1.0000000 -0.8067492
[5,] -0.5699901  0.2502752 -0.2101108 -0.8067492  1.0000000

你得到:

> 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