【问题标题】:How to 'read.csv' many files in a folder using R?如何使用 R 'read.csv' 文件夹中的许多文件?
【发布时间】:2019-09-07 04:28:43
【问题描述】:

如何读取多个 CSV 文件并将它们分别制作成数据表?

我在文件夹'A'中有'A1.csv''A2.csv''A3.csv'......的文件

所以我尝试了这个。

link <- c("C:/A")
filename<-list.files(link)
listA <- c()

for(x in filename) {
 temp <- read.csv(paste0(link , x), header=FALSE)
 listA <- list(unlist(listA, recursive=FALSE), temp)
 }

而且效果不好。我该如何做这份工作?

【问题讨论】:

    标签: r


    【解决方案1】:

    编写一个正则表达式来匹配文件名

    reg_expression <- "A[0-9]+"
    files <- grep(reg_expression, list.files(directory), value = TRUE)
    

    然后运行相同的循环,但如果需要,请使用 assign 动态命名数据帧

    for(file in files){
        assign(paste0(file, "_df"),read.csv(file))
    }
    

    但一般来说,将未知变量引入作用域是不好的做法,所以最好做一个像

    这样的循环
    dfs <- list()
    for(index in 1:length(files)){
        file <- files[index]
        dfs[index] <- read.csv(file)
    }
    

    【讨论】:

    • 您的最后一个代码块是“良好实践”的for-loop 变体:将多个相似文件读入帧列表。我建议您可以使用lapply(或sapply(..., simplify=FALSE),以提高可读性和代码高尔夫球性来显着减少这种情况。
    【解决方案2】:

    除非每个文件的结构完全不同(即不同的列...行数无关紧要),否则您可以考虑使用lapply 读取文件并将它们存储在列表中的更有效方法.好处之一是,您对一帧所做的任何事情都可以使用lapply 非常轻松地立即对所有帧执行。

    files <- list.files(link, full.names = TRUE, pattern = "csv$")
    list_of_frames <- lapply(files, read.csv)
    # optional
    names(list_of_frames) <- files # or basename(files), if filenames are unique
    

    sapply(list_of_frames, nrow) 之类的内容会告诉您每帧中有多少行。如果你有更复杂的东西,

    new_list_of_frames <- lapply(list_of_frames, function(x) {
      # do something with 'x', a single frame
    })
    

    【讨论】:

      【解决方案3】:

      最直接的问题是,在将文件路径粘贴在一起时,需要一个路径分隔符。编写文件路径时,最好使用函数file.path,因为它将尝试确定路径分隔符对于代码运行的操作系统是什么。所以你想使用:

      read.csv(files.path(link , x), header=FALSE)

      更好的是,只需在列出文件时返回完整路径(并且可以过滤 .csv):

      filename &lt;- list.files(link, full.names = TRUE, pattern = "csv$")

      结合使用assign动态创建变量的思路:

      link <- c("C:/A")
      files <-list.files(link, full.names = TRUE, pattern = "csv$")
      
      for(file in files){
        assign(paste0(basename(file), "_df"), read.csv(file))
      }
      
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-06
        • 1970-01-01
        • 1970-01-01
        • 2015-06-04
        • 2021-12-08
        • 1970-01-01
        • 1970-01-01
        • 2019-08-17
        相关资源
        最近更新 更多