我在CSV文件中有一个包含956,678行的数据。下面一段代码读取文件并将数据分组(每组包含65,000行,其余行转到最后一组)在R中。
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:
根据评论,我修改了代码并收到以下错误:
Error in data.frame(`0` = list(nih_addr_id = c(664L, 665L, 666L, 667L, :
arguments imply differing number of rows: 65000, 46677
答案 0 :(得分:1)
循环中的write.csv
正在尝试将列表写为.csv文件,而不是列表中的dataframe元素。
尝试:
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"))
}
答案 1 :(得分:1)
这是一个带有 lapply
和 data.table
的解决方案,它很快 - 即使对于大型数据集也是如此。通过将向量 my_file_rows
按 chunk_size
设置的行号分割成 65k 的块来对文件进行分块。使用 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"))
})}