【问题标题】:How can I turn the filename into a variable when reading multiple csvs into R将多个csv读入R时如何将文件名转换为变量
【发布时间】:2013-08-06 23:17:29
【问题描述】:

我有一堆遵循命名方案的 csv 文件:est2009US.csv。

我将它们读入 R 如下:

myFiles <- list.files(path="~/Downloads/gtrends/", pattern = "^est[[:digit:]][[:digit:]][[:digit:]][[:digit:]]US*\\.csv$")

myDB <- do.call("rbind", lapply(myFiles, read.csv, header = TRUE))

我想找到一种方法来创建一个新变量,对于每条记录,该变量都填充了记录来自的文件的名称。

【问题讨论】:

    标签: r csv import


    【解决方案1】:

    您可以通过使用匿名函数来避免循环两次,该函数将文件名作为一列分配给您用来读取 csv 文件的同一 lapply 中的每个 data.frame

    myDB <- do.call("rbind", lapply(myFiles, function(x) {
      dat <- read.csv(x, header=TRUE)
      dat$fileName <- tools::file_path_sans_ext(basename(x))
      dat
    }))
    

    我去掉了目录和文件扩展名。 basename()返回文件名,不包括目录,tools::file_path_sans_ext()去掉文件扩展名。

    【讨论】:

      【解决方案2】:
      Nrows <- lapply( lapply(myFiles, read.csv, header=TRUE), NROW)
      # might have been easier to store: lapply(myFiles, read.csv, header=TRUE)
      myDB$grp <- rep( myFiles, Nrows) )
      

      【讨论】:

        【解决方案3】:

        plyr 让这一切变得非常简单:

        library(plyr)
        paths <- dir(pattern = "\\.csv$")
        names(paths) <- basename(paths)
        
        all <- ldply(paths, read.csv)
        

        因为paths 已命名,all 将自动获取包含这些名称的列。

        【讨论】:

          【解决方案4】:

          您可以先从lapply 创建对象。

          Lapply <- lapply(myFiles, read.csv, header=TRUE))
          names(Lapply) <- myFiles
          for(i in myFiles) 
              Lapply[[i]]$Source = i
          do.call(rbind, Lapply)
          

          【讨论】:

          • 这里使用 Lapply 是不是很混乱?
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-12-09
          • 2018-01-13
          • 2018-07-04
          • 1970-01-01
          • 2013-06-10
          相关资源
          最近更新 更多