如何在R中有效地转置矩阵?

时间:2014-08-15 18:13:54

标签: r matrix transpose memory-efficient

我有一个大矩阵,我想要移植而不必将其带入内存。我可以通过三种方式来实现这一目标:

  1. 逐列将原始矩阵写入.txt文件。稍后,使用readLines(...)逐行将其读入内存,然后将这些行依次写入新文件。这种方法的问题是我不知道如何按列而不是按行附加到.txt文件。
  2. 逐列从.txt文件中读取矩阵,然后按行将列写入新文件。我已经尝试使用scan(pipe("cut -f1 filename.txt")),但是此操作在每次迭代时都会打开一个单独的连接,因此需要很长时间才能完成,因为打开和关闭这些连接会产生相关的开销。
  3. 使用一些未知的R功能来完成任务。
  4. 我在这里缺少什么吗?我需要使用单独的程序吗?在此先感谢您的帮助!

3 个答案:

答案 0 :(得分:3)

在这种事情上有很多语言更好。如果你真的想使用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 :(得分:1)

This post到R-help邮件列表中包含我的naive(psuedo?)代码,用于将输入文件拆分为n个转置的输出文件,然后平铺n个输出文件的块(以棋盘方式)将转置的列拼接在一起。在转置和拼接阶段中以行的大块行进行此操作非常有效。在转置矩阵以生成仍然不适合内存的文件之后,值得询问您希望做什么。还有一篇关于有效的记忆外矩阵转置的学术文献(e.g.)。

答案 2 :(得分: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-pkg那样快,但如果我错了,你应该向Ripley教授提供改进。