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

问题描述 投票:1回答:2

我有1500+个.txt文件,称为data_ {date从2015070918到今天},全部包含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
2个回答
0
投票

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

0
投票

如果您的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)
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.