读取多个 .txt 文件并在 R 中添加新列标识文件名

Read multiple .txt files and add new column identifying file name in R

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

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

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

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

我在 stackexchange 上搜索并找到了这个可能的解决方案:

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,它们导入时没有任何问题。任何解决此问题的想法将不胜感激!

您可以尝试将 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 }
    )
})

如果您的 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 向量的外观,basename()source_file.

列上使用可能很有趣