我有一个包含大约 500 个 csv 文件的列表,每个文件的文件名由一个六位数字后跟一个年份组成(例如 123456_2015.csv(。我想将所有具有相同六位数字的文件附加到一起。我尝试实现此问题中建议的代码:在 R 中导入和 rbind 多个具有通用名称的 csv 文件,但我希望将附加的数据另存为新的 csv 文件,与当前保存的原始文件位于同一目录中。我也尝试实现以下代码,但是由此生成的csv文件不包含任何数据。
rm(list=ls())
filenames <- list.files(path = "C:/Users/smithma/Desktop/PM25_test")
NAPS_ID <- gsub('.+?\([0-9]{5,6}?)\_.+?$', '\1', filenames)
Unique_NAPS_ID <- unique(NAPS_ID)
n <- length(Unique_NAPS_ID)
for(j in 1:n){
curr_NAPS_ID <- as.character(Unique_NAPS_ID[j])
NAPS_ID_pattern <- paste(".+?\_(", curr_NAPS_ID,"+?)\_.+?$", sep = "" )
NAPS_filenames <- list.files(path = "C:/Users/smithma/Desktop/PM25_test", pattern = NAPS_ID_pattern)
write.csv(do.call("rbind", lapply(NAPS_filenames, read.csv, header = TRUE)),file = paste("C:/Users/smithma/Desktop/PM25_test/MERGED", "MERGED_", Unique_NAPS_ID[j], ".csv", sep = ""), row.names=FALSE)
}
任何帮助将不胜感激。
由于您不执行任何数据操作,因此无需将文件视为表格数据。您只需要复制文件内容。
filenames <- list.files("C:/Users/smithma/Desktop/PM25_test", full.names = TRUE)
NAPS_ID <- substr(basename(filenames), 1, 6)
Unique_NAPS_ID <- unique(NAPS_ID)
for(curr_NAPS_ID in Unique_NAPS_ID){
NAPS_filenames <- filenames[startsWith(basename(filenames), curr_NAPS_ID)]
output_file <- paste0(
"C:/Users/nwerth/Desktop/PM25_test/MERGED_", curr_NAPS_ID, ".csv"
)
for (fname in NAPS_filenames) {
line_text <- readLines(fname)
# Write the header from the first file
if (fname == NAPS_filenames[1]) {
cat(line_text[1], 'n', sep = '', file = output_file)
}
# Append every line in the file except the header
line_text <- line_text[-1]
cat(line_text, file = output_file, sep = 'n', append = TRUE)
}
}
我的更改:
-
list.files(..., full.names = TRUE)
通常是最好的方法。 - 因为数字出现在文件名的开头,所以我建议
substr
.浏览代码时更容易了解发生了什么。
与其循环遍历 - 向量的索引,不如循环遍历值。如果向量为空,它更简洁,不太可能引起问题。
-
startsWith
和endsWith
是相对较新的功能,它们很棒。 - 你只关心复制线条,所以只需使用
readLines
将它们放入并cat
将它们取出即可。
你可以考虑这样的事情:
##will take the first 6 characters of each file name
six.digit.filenames <- substr(filenames, 1,6)
path <- "C:/Users/smithma/Desktop/PM25_test/"
unique.numbers <- unique(six.digit.filenames)
for(j in unique.numbers){
sub <- filenames[which(substr(filenames,1,6) == j)]
data.for.output <- c()
for(file in sub){
##now do your stuff with these files including read them in
data <- read.csv(paste0(path,file))
data.for.output <- rbind(data.for.output,data)
}
write.csv(data.for.output,paste0(path,j, '.csv'), row.names = F)
}