如何将包含 30 多个压缩文件的文件夹存储到 r 中的变量中

Posted

技术标签:

【中文标题】如何将包含 30 多个压缩文件的文件夹存储到 r 中的变量中【英文标题】:How to store a folder containing over 30 zipped files into a variable in r 【发布时间】:2018-02-02 08:32:13 【问题描述】:

我使用包“GDELTtools”从 GDELT 下载数据。现在,数据已下载,但没有变量存储在全局环境中。我想将数据存储到数据框变量中,以便进行分析。

该文件夹包含 30 多个压缩文件。每个压缩文件都包含一个 csv。我需要将所有这些 csv 存储在 r 的全局环境中的一个变量中。我希望这可以做到。

提前谢谢你!

【问题讨论】:

【参考方案1】:

好久没写R了,我会努力的。

仔细阅读 cmets,因为他们会解释程序

我将附上链接以检查以下信息:unzip、readCSV、mergeDataFrames、emptyDataFrame、concatinateStrings

根据 GDELTtools 的docs,您可以通过提供 local.folder="~/gdeltdata" 作为 GetGDELT() 函数的参数来轻松指定下载文件夹。

之后,您可以通过 list.files("path/to/files/directory") 函数来获取下面解释代码中使用的文件名向量。查看docs 了解更多示例和说明。

# set path to of unzip output
outDir <-"C:\\Users\\Name\\Documents\\unzipfolder"
# relative path where zip files are stored
relativePath <- "C:\\path\\to\\my\\directory\\"
# create varible to store all the paths to the zip files in a vector
zipPaths <- vector()
# since we have 30 files we should iterate through
# I assume you have a vector with file names in the variable fileNames
for (name in fileNamesZip) 
  # Not sure if it will work but use paste() to concat strings
  zipfilepath <- paste0(relativePath, name, ".zip")
  # append filepath
  append(zipPaths, zipfilepath)

# now we have a vector which contains all the paths to zip files
# use unzip() function and pass zipPaths to it. (Read official docs)
unzip(files=zipPaths, exdir=outDir)
# initialize dataframe for all the data. You must provide datatypes for the columns.
total <- data.frame=(Doubles=double(),
             Ints=integer(),
             Factors=factor(),
             Logicals=logical(),
             Characters=character(),
             stringsAsFactors=FALSE)
# now its time to store data by reading csv files and storing them into dataframe.
# again, I assume you have a vector with file names in the variable fileNames
for (name in fileNamesCSV) 
  # create the csv file path 
  csvfilepath <- paste0(outDir, name, ".csv")
  # read data from csv file and store in in a dataframe
  dataFrame = read.csv(file=csvfilepath, header=TRUE, sep=",")
  # you will be able to merge dataframes only if they are equal in structure. Specify the column names to merge by.
  total <- merge(data total, data dataFrame, by=c("Name1","Name2"))

【讨论】:

非常感谢您的努力。我没有带有文件名的向量。我不知道如何有效地收集 30 多个文件的名称。 好吧,但让它工作似乎很容易。我要修改答案来做到这一点。 现在我希望它能解决你的问题。祝 R 好运。它非常漂亮,适合数据科学编程语言。【参考方案2】:

一些可能更简单的事情:

    list.files() 列出目录中的文件 readr::read_csv() 会根据需要自动解压文件 dplyr::bind_rows() 将合并数据帧

那就试试吧:

lf <- list.files(pattern="\\.zip")
dfs <- lapply(lf,readr::read_csv)
result <- dplyr::bind_rows(dfs)

【讨论】:

以上是关于如何将包含 30 多个压缩文件的文件夹存储到 r 中的变量中的主要内容,如果未能解决你的问题,请参考以下文章

java - 如何从不同的文件夹压缩多个文件并使用java将压缩文件存储在一个文件夹中

当有多个来源时,Google Dataflow 一次不会读取超过 3 个输入压缩文件

ArcGIS遇上PythonArcGIS Python将多个文件夹内的分幅数据整合到同一个文件夹内——以Globeland30数据为例

ArcGIS遇上PythonArcGIS Python将多个文件夹内的分幅数据整合到同一个文件夹内——以Globeland30数据为例

使用 Hadoop 以编程方式解压缩包含多个不相关 csv 文件的文件

如何提取多个 zip 文件并在 R 中读取这些 csv? [复制]