我有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,并且它们已导入,没有任何问题。任何解决此问题的想法将不胜感激!
您可以尝试将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)