【问题标题】:importing multiple .csv files to one data set in Rstudio from multiple directories将多个 .csv 文件从多个目录导入 Rstudio 中的一个数据集
【发布时间】:2018-03-29 18:15:52
【问题描述】:

我正在做一个项目,我必须将大量 .csv 文件导入 Rstudio。这些文件对应于日期。每个日期都有一个目录,其中包含当天的文件。要获取我一直在使用的一天的所有数据:

im = list.files(pattern = "*.csv")
my-data = lapply(im, read_csv)

问题是我有数百天的文件需要浏览数百个目录。有没有办法一次将所有目录中的所有文件拉到同一个数据表中?如果它可以在数据表中包含日期(它所在的目录的标题),则会得到奖励。如果有什么不同,我们也会使用 tidyverse 和 tibbles。

【问题讨论】:

    标签: r csv import


    【解决方案1】:

    如果所有目录都在一个根目录中,请尝试list.files(recursive = TRUE),它也会搜索子目录。此外,查看set_names()imappurrr 技巧,它迭代对象的内容和名称,可以让您将文件名作为列引入。类似于以下内容。请注意,您必须使用一些字符串工具才能仅获取 filepaths 末尾的日期。

    library(tidyverse)
    all_files <- "path/to/root/folder" %>%
        list.files(pattern = "csv", "recursive = TRUE", full.names = "TRUE") %>%
        set_names() %>%
        imap_dfr(~ bind_cols(read_csv(.x), filepath = .y))
    

    【讨论】:

    • 日期是子目录的名称,我可以使用 include.dirs 将它们添加到表中吗?
    • 在一个示例上测试上面的代码,看看它做了什么。 full.names = TRUE 表示它将获取文件的完整路径,因此filepath 变量将包括文件名以及子目录名。使用str_extract 和正则表达式从中提取日期。
    • 好的,所以我运行了list.file(pattern = ".csv", recursive = TRUE, full.names = TRUE),现在我有一个格式为“date/filename.csv”的文件列表,我想将文件名中的日期应用于数据集中的文件。
    • 那么你试过第二部分了吗?它应该采用“日期/文件名.csv”并将其作为名为@9​​87654331@ 的列添加到每个导入的 csv,然后将它们行绑定到一个大的。
    • 是的,我收到了Error in cbind_all(x) : Argument 2 must be length 1, not 83
    【解决方案2】:

    我遇到了同样的问题 - 下面的解决方案对我有用 :-)

    require(tidyverse)
    
    path <- "/my/root/"
    
    read_plus <- function(flnm) {
      read_csv(flnm) %>% 
        mutate(filename = flnm)
    }
    
    my_data <-
      list.files(path, pattern = "*.csv", 
                 recursive = T,
                 full.names = T) %>% 
      map_df(~read_plus(.)) 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-09
      • 2021-07-18
      • 2020-08-02
      • 2018-03-31
      • 2014-03-17
      • 2020-12-29
      • 1970-01-01
      相关资源
      最近更新 更多