【问题标题】:Read multiple .txt files and add new column identifying file name in R读取多个 .txt 文件并在 R 中添加标识文件名的新列
【发布时间】:2020-03-12 13:21:50
【问题描述】:

我有 1500 多个名为 data_{date from 2015070918 to today} 的 .txt 文件,全部包含 7 列数据和可变行数。我设法使用以下代码将数据提取并合并到一个表中:

files = list.files(pattern = ".txt")
myData <- lapply(files, function(x) {
tryCatch(read.table(x, header = F, sep = ','), error=function(e) NULL)
})

注意:列上没有标题,目前我什至不知道哪个变量是哪个!

目前数据的文件名中只有日期,因此无法区分每日数据的每个子集。如果我可以在附加列中包含文件名,我想创建一个附加列来包含我可以提取的日期。

我在 stackexchange 上搜索并发现了这个可能的解决方案:Importing multiple .csv files into R and adding a new column with file name

df <- do.call(rbind, lapply(files, function(x) cbind(read.csv(x, header = F, sep = ","), name=strsplit(x,'\\.')[[1]][1])))

但是我收到以下错误:

 Error in read.table(file = file, header = header, sep = sep, quote = quote,  : 
 no lines available in input 

我在单个文件上使用了 read.csv,并且它们导入时没有任何问题。任何解决此问题的想法将不胜感激!

【问题讨论】:

    标签: r filenames rbind read.csv


    【解决方案1】:

    如果您的 read.table 命令正确,这应该可以:

    myData_list <- lapply(files, function(x) {
      out <- tryCatch(read.table(x, header = F, sep = ','), error = function(e) NULL)
      if (!is.null(out)) {
        out$source_file <- x
      }
      return(out)
    })
    
    myData <- data.table::rbindlist(myData_list)
    

    在过去,我发现使用data.table::fread 而不是read.table 可以省去很多麻烦。所以你可以考虑这个:

    myData_list <- lapply(files, function(x) {
      out <- data.table::fread(x, header = FALSE)
      out$source_file <- x
      return(out)
    })
    
    myData <- data.table::rbindlist(myData_list)
    

    如有必要,您可以添加 tryCatch 部分。根据files 向量的外观,在source_file 列上使用basename() 可能会很有趣。

    【讨论】:

    • 非常感谢您的回复。如果你碰巧有时间,我还有一个问题。这些名称都被提取,直到它到达一个名称以“'”作为第一个字母的名称,这导致后续行都成为该单元格的一部分。任何想法如何克服这个问题?
    • 你指的是什么名字?在表中?文件名?我认为您可以在read.tablefread 中设置自定义引号字符。或者您可以通过readLines() 读取文件,删除导致错误的值,然后将字符对象作为text 参数而不是file 提供给fread。如果这没有帮助,我建议您使用可重现的示例打开一个新问题。
    • 它在名称列中,其中一个条目是“'t name”(因此第一个字符是撇号)。然后发生这种情况之后的所有行都被编译到单元格中,将“'t name”和该行的剩余列值更改为 NA。
    【解决方案2】:

    您可以尝试使用sapply 与每个文件对应的索引:

    files <- list.files(pattern = ".txt")
    myData <- lapply(seq_along(files), function(x) {
        tryCatch(
            {
                dt <- read.table(files[x], header = F, sep = ',')
                dt$index <- x   # or files[x] is you want to use the file name instead
                dt
            },
            error=function(e) { NULL }
        )
    })
    

    【讨论】:

      猜你喜欢
      • 2017-08-03
      • 1970-01-01
      • 2019-12-07
      • 1970-01-01
      • 1970-01-01
      • 2014-02-19
      • 1970-01-01
      • 2017-04-21
      相关资源
      最近更新 更多