【问题标题】:Looping through files using dynamic name variable in R使用R中的动态名称变量循环文件
【发布时间】:2017-01-18 12:08:01
【问题描述】:

我有大量文件要导入,都保存为 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' 来完成,那就太好了。

感谢任何帮助

【问题讨论】:

  • ?fread 中的一个示例使用system("bunzip2 2008.csv.bz2") 在读入之前解压缩文件。也许您应该添加类似的行。我建议在单独的循环中执行此操作,但您可以将其注释掉并避免重复解压缩相同的文件。
  • 完整的错误信息和回溯是什么?会不会是您的工作目录或文件路径有问题?
  • @Christoph 你是对的,这是我的 wd 的问题,我正在使用笔式驱动器读取 - 我不检查基础知识是多么愚蠢!谢谢!

标签: r data.table read.table


【解决方案1】:

您可以在此处使用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 )}

【讨论】:

  • 我有所有文件名,我列出它们只是作为示例。我想将文件名传递给循环中的“unz”函数,这样我就可以递归地打开它们。
  • 您最终将拥有每个 zip 文件的 Master_Data。那么您需要使用每个文件的唯一名称将其写入磁盘。你想要这个吗?请再次查看我的答案。我已经编辑过了。
  • 谢谢,这差不多就是我所拥有的,但事实证明我使用的笔式驱动器有问题,很抱歉浪费您的时间,但感谢您的回复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-20
  • 2016-02-26
  • 2021-11-18
  • 2021-12-14
  • 2019-01-31
  • 2016-11-13
  • 1970-01-01
相关资源
最近更新 更多