【发布时间】:2017-07-01 05:55:18
【问题描述】:
所以我有一个包含大约 280 列和 10 亿数据的大型 CSV 文件,文件大小约为 20GB。下面提供了此文件的示例(大约 7 列和 4 行):
SL No.,Roll No.,J_Date,F_Date,S1,S2,S3
1,00123456789,2004/09/11,2009/08/20,43,67,56
2,987654321,2010/04/01,2015/02/20,82,98,76
3,0123459876,2000/06/25,2005/10/02,72,84,02
4,000543216789,1990/08/29,1998/05/31,15,64,82
现在鉴于文件如此之大,我将不得不一次以较小的块读取此文件,并且我能够指定块大小。但正如您可能从样本中看到的那样,“卷号”。必须读作“字符”而不是“数字”。我还需要添加列“S1”、“S2”、“S3”并将总和写入新列“MM”。
上述示例的输出必须是这样的:
SL No.,Roll No.,J_Date,F_Date,S1,S2,S3,MM
1,00123456789,2004/09/11,2009/08/20,43,67,56,166
2,987654321,2010/04/01,2015/02/20,82,98,76,256
3,0123459876,2000/06/25,2005/10/02,72,84,02,158
4,000543216789,1990/08,29,1998/05/31,15,64,82,161
我知道以前有人问过类似的问题,但我发誓我找不到 1 个对我有用的答案。我提到了以下问题:
R:Loops to process large dataset(GBs) in chunks?
Trimming a huge (3.5 GB) csv file to read into R
How do i read only lines that fulfil a condition from a csv into R?
Read numeric input as string R 还有很多。
这可能是说我在 R 方面完全是初学者的好时机,因此非常感谢各种帮助。我已经坐了很长时间了。
【问题讨论】:
-
您只有求和而不是相乘的预期输出。你可以做
Reduce('+', df1[5:7])或rowSums(df1[5:7]) -
如果您使用包 data.table 中的
fread,您的第二个问题(第 2 列的类)不是问题。使用fread的skip和nrows参数编写一个以块为单位处理文件的循环相当容易。由于fwrite可以append输出到文件也应该不是问题。 -
@akrun : 你能详细说明一下吗,我对 R 很陌生。
-
@Roland:请详细说明。我对 R 还很陌生,需要更多帮助。
-
如果你想得到5:7列的总和,那么
df1$MM <- rowSums(df1[5:7])请在你的数据集上试试