读取多个 .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
.
列上使用可能很有趣
我有 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
.