我有几个 csv 文件,我想合并为一个列表,然后输出为一个合并的 csv。假设这些文件名为file1.csv、file2.csv、file3.csv等...
file1.csv # example of what each might look like
V1 V2 V3 V4
12 12 13 15
14 12 56 23
我如何创建这些 csvs 的列表,以便我可以输出一个合并的 csv,它将标题作为文件名,顶部的列名作为注释?所以在 Excel 中看起来像这样的 csv:
# 1: V1
# 2: V2
# 3: V3
# 4: V4
file1.csv
12 12 13 15
14 12 56 23
file2.csv
12 12 13 15
14 12 56 23
file3.csv
12 12 13 15
14 12 56 23
我正在尝试在双 for 循环中使用 list
函数将这些 csvs 合并在一起,将每个列表写入一个变量,并将每个变量写入一个表输出。然而,这并没有按预期工作。
# finding the correct files in the directory
files <- dir("test files/shortened")
files_filter <- files[grepl("*\\.csv", files)]
levels <- unique(gsub( "-.*$", "", files_filter))
# merging
for(i in 1:length(levels)){
level_specific <- files_filter[grepl(levels[i], files_filter)]
bindme
for(j in 1:length(level_specific)){
bindme2 <- read.csv(paste("test files/shortened/",level_specific[j],sep=""))
bindme <- list(bindme,bindme2)
assign(levels[i],bindme)
}
write.table(levels[i],file = paste(levels[i],"-output.csv",sep=""),sep=",")
}
最佳答案
查看您的代码,我认为您不需要 for 循环。使用 data.table
包,您可以按如下方式进行:
filenames <- list.files(pattern="*.csv")
files <- lapply(filenames, fread) # fread is the fast reading function from the data.table package
merged_data <- rbindlist(files)
write.csv(merged_data, file="merged_data_file.csv", row.names=FALSE)
如果至少一个 csv
设置了列名,它们将用于结果数据表。
考虑到您的代码,它可以大大改进。这:
files <- dir("test files/shortened")
files_filter <- files[grepl("*\\.csv", files)]
可以替换为:
filenames <- list.files(pattern="*.csv")
在您的 for 循环中,您第一次调用 bindme
时,它什么也没做。它是什么?一个列表?数据框?你可以使用类似的东西:
bindme <- data.table() # or data.frame()
此外,部分:
write.table(levels[i],file = paste(levels[i],"-output.csv",sep=""),sep=",")
将生成多个 csv
文件,但您只需要一个合并文件。
关于r - 将一堆 csv 文件合并为一个带有标题的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31860887/