【问题标题】:Read files matching subdirectory patterns in R读取与 R 中的子目录模式匹配的文件
【发布时间】:2020-01-23 19:28:24
【问题描述】:

我已经使用了很多帖子来让我走到这一步(例如这里 R list files with multiple conditions 和这里 How can I read multiple files from multiple directories into R for processing? 但无法完成我在 R 中需要的内容。

我有许多分布在多个子目录中的 .csv 文件,我想读取这些文件,然后将它们作为单独的对象保存到相应的基本名称中。最终结果是将每个文件 rbind 在一起。这是示例目录结构和我尝试过的一些内容:

./DATA/Cat_Animal/animal1.csv
./DATA/Dog_Animal/animal2.csv
./DATA/Dog_Animal/animal3.csv
./DATA/Dog_Animal/animal3.1.csv

#read in all csv files
files <- list.files(path="./DATA", pattern="*.csv", full.names=TRUE, recursive=TRUE)

但这会导致所有子目录中的所有文件。我想匹配特定子目录中与模式 (X_Animal) 匹配的特定文件 (animalsX.csv),例如:

files <- dir(path=paste0("./DATA/", pattern="*+_Animal"), recursive=TRUE, full.names=TRUE, pattern="animal+.*csv")

获得文件列表后,我想读取每个文件并将每个文件保存到相应文件的基本名称中。所以名为 animal1.csv 的文件 将被保存到animal1。我想我需要在循环中的某处使用函数 basename() 但不知道如何。

非常感谢您的帮助 我花了很多时间尝试各种选项,但进展甚微。

【问题讨论】:

  • 循环在哪里?您能否更准确地谈谈您的示例 - 什么将保存在什么位置和什么对象下?

标签: r list csv


【解决方案1】:

这个问题真的是两个问题,考虑把它们分开。在您问题的最后一部分,如何将一个充满 data.frames 的列表合并在一起尝试:

finalDf = do.call(rbind, result)

您可能需要使用stringr 包中的str_split() 来提取您需要的文件路径部分。您也可以使用str_extract() 正则表达式。

【讨论】:

  • 好的,我将删除问题的后半部分,因此编辑以专注于循环/读取文件并保存到相应的基本名称。
【解决方案2】:

我想我找到了一个短期的解决方法,因为幸运的是我目前只有几个子目录。

myFiles1 <- list.files(path = "./DATA/Cat_Animal/", pattern="animal+.*csv")

processFile <- function(f) {
  df <- read.csv(file = paste0("./DATA/Cat_Animal/", f ))
}
result1 <- sapply(myFiles1, processFile)

#then do it again for the next subdir:
myFiles2 <- list.files(path = "./DATA/Dog_Animal/", pattern="animal+.*csv")

processFile <- function(f) {
  df <- read.csv(file = paste0("./DATA/Dog_Animal/", f ))
}
result2 <- sapply(myFiles2, processFile)

finalDf = do.call(rbind, result1, result2)

我知道有更好的方法,但无法确定子目录的模式匹配!例如在 unix 中这很容易

【讨论】:

  • 你在unix中使用正则表达式吗?如果是这样,str_extract() 可能正是您正在寻找的。​​span>
  • 谢谢。在 unix 中,读取子目录中所有匹配文件的路径只是:./DATA/*_Animal/animal*.csv。基于 str_extract() 文档,如何添加到 list.files() 并不是那么容易和不清楚,但会继续尝试
猜你喜欢
  • 2015-06-14
  • 2014-05-02
  • 2023-03-15
  • 2016-03-22
  • 2013-01-07
  • 1970-01-01
  • 2020-12-21
  • 2014-02-04
相关资源
最近更新 更多