创建一个for循环以分块读取大数据并创建新列

Posted

技术标签:

【中文标题】创建一个for循环以分块读取大数据并创建新列【英文标题】:Create a for-loop to read big data in chunks and create new columns 【发布时间】:2017-08-08 07:39:40 【问题描述】:

我是使用 R 编程的新手。

我正在尝试编写一个循环,在该循环中分别读取数据块(因为数据大小为 20GB,包含 3 亿行)并执行代码来创建日期列并将每个块作为 csv 文件写入每个文件夹。以下是另一位成员建议的试验。它运行顺利,但唯一的问题是,一旦执行该过程,我就无法在同一个循环中写入每个块。

index = 0
nrows = length(count.fields("RM.csv", sep = ",")) 
df = vector('list',ceiling(nrows/2)) 
col_names = colnames(read.csv('RM.csv', nrow=1, header = T))
end_found=FALSE

while(!end_found)

  begin = 1000*index
  end = min(nrows,begin+1000)
  print(paste0("Reading rows ", begin+1 ," to ", end ))
  df[[index+1]] = fread('RM.csv',skip = begin, nrows =end-begin,
                        col.names = col_names)
  index = index+1
  if(end==nrows) end_found=TRUE
  df = do.call(as.data.frame,df)
  write.csv(df,file = paste0('test1',index,'.csv'))

数据:

RM.csv:
        Date
    1   7/30/2017 19:16
    2   7/30/2017 19:05
    3   7/30/2017 19:03
    4   7/30/2017 19:37
    5   7/30/2017 18:36
    6   7/30/2017 20:08
    7   7/30/2017 19:00
    8   7/30/2017 19:21
    9   7/30/2017 17:01

期望的输出:

    Date    Month   Year
1   7/30/2017 19:16 Jul-17  2017
2   7/30/2017 19:05 Jul-17  2017
3   7/30/2017 19:03 Jul-17  2017
4   7/30/2017 19:37 Jul-17  2017
5   7/30/2017 18:36 Jul-17  2017
6   7/30/2017 20:08 Jul-17  2017
7   7/30/2017 19:00 Jul-17  2017
8   7/30/2017 19:21 Jul-17  2017
9   7/30/2017 17:01 Jul-17  2017

【问题讨论】:

你能描述一下预期的输出是什么吗?不知道RM.csv 的样子有点难以想象。此外,循环和重复读取一个大的输入文件也是一个坏主意。 您知道可以将数据附加到文件中吗?阅读write.table 的帮助页面。 @Adam Quek 我已经更新了我的问题。因此,假设我使用此循环提取了包含日期的 9 行块,而不是为同一块创建了两个多列(例如月份和年份),并且它应该在同一目录中写出一个 csv 文件。稍后使用批处理脚本或 mysql 我将附加这些文件。 【参考方案1】:

下面是将iris 数据集分解为 15 个数据帧的示例,每个帧有 10 行。希望这可以帮助您尝试对数据集进行的操作。

seq.int <- seq(0, nrow(iris), 10)
seq.gp <- cut(1:nrow(iris), breaks=seq.int, include.lowest=TRUE)

iris_list <- split(iris, seq.gp)

然后,您可以使用列表友好的循环或 lapply 操作列表中的每个 data.frame。之后,每个 data.frame 都可以写成单独的 csv,如下所示:

names(iris_list) <- paste0("test1_", sprintf("%02d", 1:length(iris_list)))
lapply(names(iris_list), function(x) write.csv(iris_list[[x]], paste0(x, ".csv")))

【讨论】:

以上是关于创建一个for循环以分块读取大数据并创建新列的主要内容,如果未能解决你的问题,请参考以下文章

嵌套for循环熊猫数据框不会创建新列

循环遍历数据框列表以动态创建新列

循环以基于Python Dataframe中的其他列值创建新列[重复]

循环遍历 csv 文件以创建连接的数据帧。需要在文件名中使用日期为每个文件创建新列

python大文件处理

编写 R 循环以创建新的标准化列