【发布时间】:2019-05-07 10:09:08
【问题描述】:
我有超过 300 个具有相同文件名的大型 CSV 文件,每个文件位于一个单独的子目录中,我想使用 R 将它们合并到一个数据集中。我正在寻求有关如何删除我没有的列的帮助不需要在每个 CSV 文件中,同时以一种将过程分解成更小的块的方式进行合并,以便我的内存更容易处理。
我的目标是创建一个 CSV 文件,然后我可以将其导入 STATA 以使用我已经编写并在其中一个文件上测试过的代码进行进一步分析。
我的每个 CSV 本身都相当大(大约 80 列,其中许多是不必要的,每个文件有数万到数十万行),总共有近 1600 万个观察值,或大约 12GB。
我已经编写了一些代码,可以成功地为两个 CSV 的测试用例做到这一点。挑战在于我的工作和个人计算机都没有足够的内存来为所有 300 多个文件执行此操作。
我试过的代码在这里:
library(here) ##installs package to find files
( allfiles = list.files(path = here("data"), ##creates a list of the files, read as [1], [2], ... [n]
pattern = "candidates.csv", ##[identifies the relevant files]
full.names = TRUE, ##identifies the full file name
recursive = TRUE) ) ##searches in sub-directories
read_fun = function(path) {
test = read.csv(path,
header = TRUE )
test
} ###reads all the files
(test = read.csv(allfiles,
header = TRUE ) )###tests that file [1] has been read
library(purrr) ###installs package to unlock map_dfr
library(dplyr) ###installs packages to unlock map_dfr
( combined_dat = map_dfr(allfiles, read_fun) )
我希望结果是单个 RDS 文件,这适用于测试用例。不幸的是,当查看我所有文件的 15.5m 观察值时,此过程所需的内存量导致 RStudio 崩溃,并且没有生成 RDS 文件。
我正在寻求有关以下方面的帮助: 1) 通过删除我不需要的 CSV 文件中的一些变量(标题为 junk1、junk2 等的列)来减少内存负载;和 2) 如何以更易于管理的方式合并我的 CSV 文件,将我的 CSV 文件按顺序合并到几个 RDS 文件中,然后再合并,或者通过循环累积到单个 RDS 文件中。
但是,我不知道如何继续这些 - 我对 R 还是新手,非常感谢任何关于如何继续 1) 和 2) 的帮助。
谢谢,
【问题讨论】: