我在我目前正在工作的研究所的望远镜上有这个巨大的数据库,这台望远镜将每一天保存在一个文件中,它每10个测量的8个通道中的每一个都需要值。秒,并且每天从00:00开始并在23:59结束,除非出现连接错误,在这种情况下,一天有2个或更多文件。
此外,数据库存在测量错误,缺失数据,重复值等。
文件扩展名是.sn1,保存在一个文件中的天数,.sn1,.sn2,.sn3 ......,保存在多个文件中的天数,所有文件都有相同数量的行和变量,除了有2种格式的数据库,其中一种有一种标题,它使用文件的前5行,另一种没有。
每个月都有它自己的文件夹,包括它所拥有的日期,然后这个文件夹会在它们所属的年份保存,所以10年来我一直在谈论超过3000个文件,并且说实话,我之前从未使用.sn1文件
我有代码将2个或少数几个文件合并为1个,但这次我有数千个文件(这比我之前使用的文件更多,也是为什么我可以'提供一个简单的例子)我想生成一个程序,将所有文件合并到一个巨大的数据库中,这样我就可以从中获得更好的样本。
我有一个Excel扩展名列出了特定文件夹中的所有文件位置,我可以使用这样的列表将所有文件放在一起吗?
答案 0 :(得分:1)
评论的建议太长了,所以我在这里发布它们作为一个aswer。
您似乎可以将文件读入R(一次至少一个),所以我没有进入。
多个位置:如果您有所有位置的列表,则可以在这些位置进行搜索,以便为您提供所需的文件。您提到了一个excel文件(让我们称之为paths.csv - 只有一列包含目录位置):
library(data.table)
all_directories <- fread(paths.csv, col.names = "paths")
# Focussing on only .sn1 files to begin with
files_names <- dir(path = all_directories$paths[1], pattern = ".sn1")
# Getting the full path for each file
file_names <- paste(all_directories$path[1], file_names, sep = "/")
阅读所有文件:我创建了一个以空格分隔的虚拟文件,并为其提供了扩展名&#34; .sn1&#34; - 我能够使用data.table::fread()
正确阅读。如果您能够使用记事本或类似的东西打开文件,它也适合您。需要有关如何将具有不同标头的文件彼此区分的更多信息 - 它们是遵循命名约定还是具有不同的扩展(似乎是这种情况)。现在关注具有5行标题/其他信息的文件。
read_func <- function(fname){
dat <- fread(fname, sep = " ", skip = 5)
dat$file_name <- fname # Add file name as a variable - to use for sorting the big dataset
}
# Get all files into a list
data_list <- lapply(file_names, read_func)
# Merge list to get one big dataset
dat <- rdbindlist(data_list, use.names = T, fill = T)
执行上述所有操作将为所有具有扩展名&#34; .sn1&#34;的文件提供数据集。在目录列表(paths.csv)的第一个目录中。您可以将所有这些包含在一个函数中,并在所有不同的目录上使用lapply
来获取一个列表,其中每个元素都是所有此类文件的数据集。
要包含&#34; .sn2&#34;,&#34; .sn3&#34; ...扩展您可以修改呼叫,如下所示:
ptrns <- paste(sapply(1:5, function(z) paste(".sn",z,sep = "")), collapse = "|")
# ".sn1|.sn2|.sn3|.sn4|.sn5"
dir(paths[1], pattern = ptrns)
这里的简化版本应该立即适用于所有目录中的所有文件扩展名 - 如果文件太大等可能需要一些时间。您可能需要考虑以块的形式执行此操作。
# Assuming only one column with no header. sep is set to ";" since by default fread may treate spaces
# as separators. You can use any other symbol that is unlikely to be present in the location names
# We need the output to be a vector so we can use `lapply` without any unwanted behaviour
paths_vec <- as.character(fread("paths.csv", sep = ";", select = 1, header = F)$V1)
# Get all file names incl. location)
file_names <- unlist(lapply(paths_vec, function(z){
ptrns <- paste(sapply(1:5, function(q) paste(".sn",q,sep = "")), collapse = "|")
inter <- dir(z, pattern = ptrns)
return(paste(z,inter, sep = "/"))
}))
# Get all data in a single data.table using read_func previously defined
dat <- rbindlist(lapply(file_names, read_func), use.names = T, fill = T)