如何将包含 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数据为例