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



我有一个带有一些值的文件(这里以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

我想在对称矩阵或数据帧中读取相同的行/列大小,所以在这种情况下是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")

最新更新