R从不均匀长度的行输入文件创建对称矩阵

R Create symmetric matrix from uneven lengthed rows input file

我有一个包含一些值的文件(此处以 25 为例):

0.8259E-02  0.5264E-02
0.5653E-02  0.3301E-02
0.5127E-04
0.8259E-02  0.5264E-02
0.5653E-02  0.3301E-02
0.5127E-04
0.8259E-02  0.5264E-02
0.5653E-02  0.3301E-02
0.5127E-04
0.8259E-02  0.5264E-02
0.5653E-02  0.3301E-02
0.5127E-04
0.8259E-02  0.5264E-02
0.5653E-02  0.3301E-02
0.5127E-04

我想在对称矩阵或等于 row/column 大小的数据帧中读取,因此在本例中为 5*5。前 5 个元素将是矩阵中第一行中的值。

矩阵应如下所示:

          [,1]      [,2]      [,3]      [,4]      [,5]
[1,] 8.259e-03 5.264e-03 5.653e-03 3.301e-03 5.127e-05   
[2,] 8.259e-03 5.264e-03 5.653e-03 3.301e-03 5.127e-05
[3,] 8.259e-03 etc....  

在我原来的 .txt 文件中,矩阵将是 86*86,每行的元素数量不同。

我将如何在 R 中阅读此内容?

问题中没有关于结果中的哪个矩阵元素对应于输入中的哪个位置的信息,因此我们假设逐行读取时输入按 1,1 顺序填充矩阵; 2,1; 3,1; ...; 5,5。请注意,这不会为问题中的数据提供对称矩阵,但我们假设您的实际数据是对称的。

现在使用最后注释中可重复显示的数据使用 scan 将其作为数字向量读入,然后将其整形为矩阵。如果您想要转置,请将参数 byrow=TRUE 添加到 matrix

vec <- scan("matrix.dat", quiet = TRUE)
n <- sqrt(length(vec))
m <- matrix(vec, n, n)
m

给予:

          [,1]      [,2]      [,3]      [,4]      [,5]
[1,] 8.259e-03 8.259e-03 8.259e-03 8.259e-03 8.259e-03
[2,] 5.264e-03 5.264e-03 5.264e-03 5.264e-03 5.264e-03
[3,] 5.653e-03 5.653e-03 5.653e-03 5.653e-03 5.653e-03
[4,] 3.301e-03 3.301e-03 3.301e-03 3.301e-03 3.301e-03
[5,] 5.127e-05 5.127e-05 5.127e-05 5.127e-05 5.127e-05

注意到数据中只有 5 个唯一值,如果这些值是 5 条对角线上的值,那么您可能需要以下内容,其中 vec 和 m 已在上面定义。这确实给出了一个对称矩阵

matrix(unique(vec)[abs(row(m) - col(m)) + 1], 5, 5)

给予:

          [,1]     [,2]     [,3]     [,4]      [,5]
[1,] 8.259e-03 0.005264 0.005653 0.003301 5.127e-05
[2,] 5.264e-03 0.008259 0.005264 0.005653 3.301e-03
[3,] 5.653e-03 0.005264 0.008259 0.005264 5.653e-03
[4,] 3.301e-03 0.005653 0.005264 0.008259 5.264e-03
[5,] 5.127e-05 0.003301 0.005653 0.005264 8.259e-03

备注

Lines <- "0.8259E-02  0.5264E-02
0.5653E-02  0.3301E-02
0.5127E-04
0.8259E-02  0.5264E-02
0.5653E-02  0.3301E-02
0.5127E-04
0.8259E-02  0.5264E-02
0.5653E-02  0.3301E-02
0.5127E-04
0.8259E-02  0.5264E-02
0.5653E-02  0.3301E-02
0.5127E-04
0.8259E-02  0.5264E-02
0.5653E-02  0.3301E-02
0.5127E-04"
cat(Lines, file = "matrix.dat")