将相关矩阵转换为包含每行列对记录的数据框
Transform Correlation Matrix into dataframe with records for each row column pair
我有一个很大的相关矩阵 (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
.......等等.
有人有什么建议吗?如果我能澄清任何事情,请告诉我
谢谢,
本
对于矩阵 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)
例如,相关矩阵:
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
使用一点 tidyverse 很容易:
给定一个相关矩阵X
:
X %>% as.data.frame %>% tibble::rownames_to_column() %>%
tidyr::pivot_longer(-rowname)
当然,您可以使用 rownames_to_column
和 pivot_longer
参数更改名称,也可以添加 filter(rowname != name)
以消除对角线相关性。
我有一个很大的相关矩阵 (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
.......等等.
有人有什么建议吗?如果我能澄清任何事情,请告诉我
谢谢, 本
对于矩阵 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)
例如,相关矩阵:
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
使用一点 tidyverse 很容易:
给定一个相关矩阵X
:
X %>% as.data.frame %>% tibble::rownames_to_column() %>%
tidyr::pivot_longer(-rowname)
当然,您可以使用 rownames_to_column
和 pivot_longer
参数更改名称,也可以添加 filter(rowname != name)
以消除对角线相关性。