【问题标题】:Split up data in CSV file and writing to a file in slices using R拆分 CSV 文件中的数据并使用 R 将数据写入切片中的文件
【发布时间】:2017-01-22 08:17:57
【问题描述】:

我在 CSV 文件中有一个包含 956,678 行的数据。以下代码读取文件并在 R 中将数据分组(每组有 65,000 行,其余行归最后一组)。

my_file <- read.csv("~myfile_path/file.csv")
grps <- (split(my_file, (seq(nrow(my_file))-1) %/% 65000))
for (i in grps)
{
write.csv(grps, paste("path/output_file", i, ".csv", sep=""))
}

现在,我想将这些组作为 CSV 文件写入磁盘。谁能建议我怎么做?

EDIT1:

根据cmets,我修改了代码,出现如下错误:

data.frame 中的错误(0 = list(nih_addr_id = c(664L, 665L, 666L, 667L, : 参数暗示不同的行数:65000、46677

【问题讨论】:

  • my_file 已经是一个 data.frame。您不需要以下语句。
  • split(df, sample(1:round(nrow(df)/65000), 65000)) 然后使用for-loopwrite.csvsplit 操作生成的列表中的每个块。
  • @Abdou:感谢您的反馈。使用您建议的拆分方法。我收到以下错误:“sample.int(length(x), size, replace, prob) 中的错误:当 'replace = FALSE' 时无法获取大于总体的样本”
  • @Tensibai:我已经编辑了我迄今为止尝试过的问题。我收到错误消息。
  • @G.Grothendieck:谢谢。刚刚根据您的评论编辑了代码。

标签: r export-to-csv


【解决方案1】:

您在循环中的 write.csv 正在尝试将列表写入 .csv 文件,而不是列表的数据框元素。

试试:

my_file <- read.csv("~myfile_path/file.csv")
grps <- (split(my_file, (seq(nrow(my_file))-1) %/% 65000))
for (i in seq_along(grps)) {
    write.csv(grps[[i]], paste0("path/output_file", i, ".csv"))
}

【讨论】:

    【解决方案2】:

    这是一个带有lapplydata.table 的解决方案,速度很快——即使对于大型数据集也是如此。该文件通过将向量my_file_rows 拆分为65k 的块,按chunk_size 设置的行号进行分块。使用split 函数会自动处理其余部分。您可以根据自己的喜好调整chunk_size 中的数字,轻松调整行数。此解决方案通过粘贴 x[1] 将每个块的开始行号粘贴到文件名中。

      my_file_rows <- seq(1, nrow(my_file))
      chunk_size <- 65e3
    
      lapply(split(my_file_rows, ceiling(my_file_rows/chunk_size)), function(x){
    
        fwrite(my_file[x,], paste0("path/output_file", x[1], ".csv"))
    
      })}
    

    【讨论】:

      猜你喜欢
      • 2019-11-25
      • 1970-01-01
      • 2020-11-05
      • 2015-12-13
      • 1970-01-01
      • 1970-01-01
      • 2014-12-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多