【问题标题】:Importing files from different folders, adding columns with values extracted from each file name?从不同文件夹导入文件,添加从每个文件名中提取的值的列?
【发布时间】:2020-09-27 17:17:06
【问题描述】:

我正在使用 R 进行一些数据分析。我将数据保存在与其来源年份相关的单独文件夹中。在每个 year 文件夹中都有几个类别文件夹,每个类别文件夹都有需要导入的 .csv 和 .dat 文件。文件名的结构类似“category_outlet_timeinterval.csv”或“.dat”。每年包含相同的类别,每个类别包含相同类型的文件,只是时间间隔不同。

我需要从几个不同的文件夹中导入这些文件,并为年份、类别和出口添加一列。要进入这些列的值需要从每个文件名中读取。添加列后,文件将合并到一个数据框中。

我已经使用 fread 完成了合并部分:

# (1) Create File List
csv_files <- list.files (path       = "R/win-library/Practice", 
                         pattern    = "*.csv",
                         recursive  = T,
                         full.names = T)

# (2) Import All csv with 'fread()'
DATA_ALL <- rbindlist (lapply (csv_files, fread))
view(DATA_ALL)

问题:

-我可以从文件名中检索信息作为子字符串并相应地创建列的最有效方法是什么?

-我必须将每个文件都设为数据框,还是可以从文件列表中全部完成?这个问题的主要原因是文件很大。

我是 R 的初学者,并试图掌握它。抱歉,如果我不清楚。提前致谢!

【问题讨论】:

    标签: r dataframe merge data-analysis fread


    【解决方案1】:

    您可以在数据框中创建包含路径和文件名信息的列:

    files <- list.files(path = path,
                        full.names = TRUE,
                        all.files = FALSE,
                        recursive = TRUE)
    files <- files[!file.info(files)$isdir]
    
    data <- lapply(files,
                   function(x) {
                     data <- read_xls(x, sheet = 1)
                     data$File_name <- basename(x)
                     data$Path <- dirname(x)
                     data
                     })
    

    然后,您可以从这些列中计算出您所关注的信息(例如年份)。我通常会使用stringr 函数如str_detectstr_extract 从文件名和路径中提取相关信息。

    【讨论】:

    • 我喜欢这个主意!它比我想象的要简单。你能一步一步地简要解释一下代码吗?我对 files
    • list.files 返回目标文件夹中的文件和目录。 file.info()$isdir 返回一个布尔向量,它告诉您哪些对象是目录。 ! 是逻辑否定函数。在files[!file.info(files)$isdir] 中,我们对files 向量进行子集化,并删除那些属于目录的元素。我们剩下一个只包含文件的向量。对象datalist,只要作为列表元素的数据框具有相同的列,您就可以使用dpyr 中的bind_rows 函数将它们全部绑定在一起。在 R 中有很多方法。
    猜你喜欢
    • 1970-01-01
    • 2011-05-21
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2020-08-02
    相关资源
    最近更新 更多