我有一个大矩阵,我想要移植而不必将其带入内存。我可以通过三种方式来实现这一目标:
readLines(...)
逐行将其读入内存,然后将这些行依次写入新文件。这种方法的问题是我不知道如何按列而不是按行附加到.txt文件。scan(pipe("cut -f1 filename.txt"))
,但是此操作在每次迭代时都会打开一个单独的连接,因此需要很长时间才能完成,因为打开和关闭这些连接会产生相关的开销。我在这里缺少什么吗?我需要使用单独的程序吗?在此先感谢您的帮助!
答案 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教授提供改进。