我应该如何在R中高效地转置矩阵?

3
我有一个大矩阵,希望不用将其加载到内存中即可转置。我能想到以下三种方法来完成此操作:
  1. 按列将原始矩阵写入.txt文件。稍后,使用readLines(...)逐行将其读入内存,并将这些行顺序写入新文件。但是,这种方法的问题在于我不知道如何按列而不是按行附加到.txt文件。
  2. 按列从.txt文件读取矩阵,然后按行将列写入新文件。我已经尝试过使用scan(pipe("cut -f1 filename.txt")),但由于每次迭代都会打开一个单独的连接,因此由于打开和关闭这些连接所需的开销而导致花费时间太长。
  3. 使用某个未知的R函数来完成任务。
这里是否有我遗漏的内容?我需要使用单独的程序吗?感谢您提前的帮助!

3
R使用内存中的对象。在R论坛中,您基本上正在询问如何在不使用R的情况下对矩阵进行转置。更重要的问题是,您最终想要实现什么? - Señor O
我有一个矩阵,它太大了无法在内部存储,但我想对其列执行操作。因此,我可以读取一列,执行操作并存储输出,然后读取下一列并重复,或者我可以转置矩阵,然后按行进行导入(我知道如何使用readLines进行操作)。 - mcarzolio
3个回答

3

有很多编程语言比R更擅长这种操作。如果你真的想使用R,你需要逐行读取文件,从所需列中获取一个元素,将其存储在向量中,然后将该向量作为一行写入文件。对于每一列都要这样做。

Columns = 1e9
Rows = 1e6

FileName = "YourFile.csv"
NewFile = "NewFileName"

for(i in 1:Columns)
{
    ColumnToBeRow = vector("numeric", Columns)
    for(j in 1:Rows)
    {
        ColumnToBeRow[j] = read.csv(FileName, nrows=1, skip=(j - 1), header=F)
    }
    write.csv(ColumnToBeRow, NewFile, append=TRUE)
}

1

这篇文章是关于如何将输入文件分割成n个转置输出文件,然后在n个输出文件的块(以棋盘式图案)上进行瓦片处理,将转置的列拼接回来。在转置和拼接阶段分块行操作是高效的。值得问一下,当转置矩阵生成仍无法在内存中容纳的文件时,您希望做什么。另外还有一些学术文献介绍了高效的大规模矩阵转置方法(例如)。


0

scan 可以将其作为流读入,您只需要添加的是行数。由于原始矩阵具有维度属性,因此您只需要保存列值并在读回时将其用作行值。

 MASS::write.matrix(matrix(1:30, 6), file="test.txt")

 matrix( scan("test.txt"), 5)

#-------------
Read 30 items
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    2    3    4    5    6
[2,]    7    8    9   10   11   12
[3,]   13   14   15   16   17   18
[4,]   19   20   21   22   23   24
[5,]   25   26   27   28   29   30

我怀疑你编写的将矩阵行写成一行的代码不会像Ripley的MASS包那样快,但如果我错了,你应该向Ripley教授提供改进。


你的方法不起作用,因为它会将整个矩阵加载到内存中。假设矩阵是1,000,000 x 1,000,000,000,000。这个操作将花费太长时间,并且会遇到内存问题。 - mcarzolio
3
R不是你尝试做的事情的理想选择。 - Señor O
同意O先生的观点;R不是处理如此庞大任务的正确工具。你暗示矩阵已经在内存中,但如果它无法重新装入内存,那怎么可能呢? - IRTFM
抱歉造成困惑。矩阵从未完全存储在内存中,而是逐行写入文本文件。首先生成并附加第一行到文件,然后是下一行,以此类推。 - mcarzolio
听起来像是一个 Hadoop 的问题。 - IRTFM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接