用R读取和重建对称矩阵

时间:2019-06-03 07:33:17

标签: r file dataframe parsing matrix

我需要从文件中读取以下矩阵。它是一个对称相关矩阵,因此省略了一半。

  1.00  
  0.49  1.00  
  0.53  0.57  1.00  
  0.49  0.46  0.48  1.00  
  0.51  0.53  0.57  0.57  1.00  
  0.33  0.30  0.31  0.24  0.38  1.00  
  0.32  0.21  0.23  0.22  0.32  0.43  1.00  
  0.20  0.16  0.14  0.12  0.17  0.27  0.33  1.00  
  0.19  0.08  0.07  0.19  0.23  0.24  0.26  0.25  1.00  
  0.30  0.27  0.24  0.21  0.32  0.34  0.54  0.46  0.28  1.00  
  0.37  0.35  0.37  0.29  0.36  0.37  0.32  0.29  0.30  0.35  1.00  
  0.21  0.20  0.18  0.16  0.27  0.40  0.58  0.45  0.27  0.59  0.31  1.00

当前,我正在使用

data1 <- na.omit(as.vector(t(read.table('triangle-data.txt', fill = TRUE))))
pt <- 12
R <- matrix(0, nrow = pt , ncol = pt)
for(i in 1:pt){
  R[i, 1:i] <- data1[(i*(i-1)/2 + 1): (i*(i+1)/2)]
}
R <- R + t(R) - diag(rep(1, pt))
R

结果是

> dput(R)
structure(c(1, 0.49, 0.53, 0.49, 0.51, 0.33, 0.32, 0.2, 0.19, 
0.3, 0.37, 0.21, 0.49, 1, 0.57, 0.46, 0.53, 0.3, 0.21, 0.16, 
0.08, 0.27, 0.35, 0.2, 0.53, 0.57, 1, 0.48, 0.57, 0.31, 0.23, 
0.14, 0.07, 0.24, 0.37, 0.18, 0.49, 0.46, 0.48, 1, 0.57, 0.24, 
0.22, 0.12, 0.19, 0.21, 0.29, 0.16, 0.51, 0.53, 0.57, 0.57, 1, 
0.38, 0.32, 0.17, 0.23, 0.32, 0.36, 0.27, 0.33, 0.3, 0.31, 0.24, 
0.38, 1, 0.43, 0.27, 0.24, 0.34, 0.37, 0.4, 0.32, 0.21, 0.23, 
0.22, 0.32, 0.43, 1, 0.33, 0.26, 0.54, 0.32, 0.58, 0.2, 0.16, 
0.14, 0.12, 0.17, 0.27, 0.33, 1, 0.25, 0.46, 0.29, 0.45, 0.19, 
0.08, 0.07, 0.19, 0.23, 0.24, 0.26, 0.25, 1, 0.28, 0.3, 0.27, 
0.3, 0.27, 0.24, 0.21, 0.32, 0.34, 0.54, 0.46, 0.28, 1, 0.35, 
0.59, 0.37, 0.35, 0.37, 0.29, 0.36, 0.37, 0.32, 0.29, 0.3, 0.35, 
1, 0.31, 0.21, 0.2, 0.18, 0.16, 0.27, 0.4, 0.58, 0.45, 0.27, 
0.59, 0.31, 1), .Dim = c(12L, 12L))

这太笨拙了,我需要对它的大小进行硬编码。有没有更方便的方法?

1 个答案:

答案 0 :(得分:1)

我使用readLinesstrsplit的组合来读取文件

a <- sapply(sapply(lapply(readLines("triangle.txt"), 
                          function(x) strsplit(x, " ")), "[", 1), 
            function(x) na.omit(as.numeric(x)))

rbind将其转换为方阵

A <- do.call("rbind", a)

尽管有警告,但仍可以从文件中正确读取矩阵的下部,但上部均被弄乱了,我用一些肮脏的技巧对其进行了修复

A[upper.tri(A)] <- 0
A <- A + t(A) - diag(nrow(A))

编辑

另一个基于系数向量的简单解决方案:

data1 <- na.omit(as.vector(t(read.table('triangle.txt', fill = TRUE))))
n <- Re(polyroot(c(-length(data1), 1/2, 1/2)))[1]
A <- matrix(0, n, n)
A[upper.tri(A, diag = T)] <- data1
A <- A + t(A) - diag(n)