使用R中的动态名称变量循环遍历文件

时间:2017-01-18 12:08:02

标签: r data.table read.table

我有大量要导入的文件,这些文件都保存为zip文件。

从阅读其他帖子看来,我需要传递zip文件名,然后传递我要打开的文件的名称。由于我有很多这些,我以为我可以遍历所有文件并逐个导入它们。

有没有办法动态传递名称,还是有更简单的方法来执行此操作?

这是我到目前为止所做的:

Temp_Data <- NULL
Master_Data <- NULL


file.names <- c("f1.zip", "f2.zip", "f3.zip", "f4.zip", "f5.zip")

for (i in 1:length(file.names)) {
    zipFile <- file.names[i]
    dataFile <- sub(".zip", ".csv", zipFile)

    Temp_Data <- read.table(unz(zipFile, 
                            dataFile), sep = ",")

    Master_Data <- rbind(Master_Data, Temp_Data)

}

我收到以下错误:

In open.connection(file, "rt") :

我可以使用以下方法手动导入它们:

dt <- read.table(unz("D:/f1.zip", "f1.csv"), sep = ",")

我可以动态地创建刺痛但感觉很长 - 当我用read.table(unz(...))包装它时它不起作用。它似乎无法找到文件名,因此抛出错误

cat(paste(toString(shQuote(paste("D:/",zipFile, sep = ""))),",",
      toString(shQuote(dataFile)), sep = ""), "\n")

但如果我将其打印到控制台,我会得到:

"D:/f1.zip","f1.csv"

然后我可以将它粘贴到`read.table(unz(....))并且它可以工作,所以我觉得我很接近

我已在data.table中标记,因为这是我几乎总是使用的,所以如果可以使用'fread'来完成那将是很棒的。

感谢任何帮助

1 个答案:

答案 0 :(得分:2)

您可以在此处使用list.files命令:

首先设置您的工作目录,其中存储所有文件:

setwd("C:/Users/...")

然后

file.names = list.files(pattern = "*.zip", recursive = F)

那么你的for循环将是:

for (i in 1:length(file.names)) {
#open the files

zipFile <- file.names[i]
dataFile <- sub(".zip", ".csv", zipFile)

Temp_Data <- read.table(unz(zipFile, 
                        dataFile), sep = ",")
# your function for the opened file
Master_Data <- rbind(Master_Data, Temp_Data)

#write the file finaly
write_delim(x = Master_Data, path = paste(file.names[[i]]), delim = "\t", 
col_names = T )}