我使用以下功能将目录中的所有.csv文件合并到一个数据框中:
multmerge = function(mypath){
filenames = list.files(path = mypath, full.names = TRUE)
rbindlist(lapply(filenames,fread),fill = TRUE) }
dataframe = multmerge(path)
此代码会产生以下错误:
rbindlist(lapply(filenames,fread),fill = TRUE)中的错误:内部错误:结果的第25列被确定为integer64,但maxType =='character'!= REALSXP
之前,该代码已在相同的csv文件上工作...我不确定发生了什么更改以及错误消息的含义。
答案 0 :(得分:0)
因此,在查看fread文档时,我刚刚注意到有一个integer64选项,那么您是否要处理大于2 ^ 31的整数?
编辑:我添加了tryCatch,它将在控制台中打印格式化消息,指示哪些文件导致了实际错误消息。但是,要使rbindlist然后在常规文件上执行,您需要创建一个虚拟列表,该列表将产生一个名为ERROR的额外列,该列的所有行都具有NA,除了最下面的那一行将以问题文件的名称为其值。
我建议您运行一次此代码之后,从data.table中删除ERROR列和多余的行,然后将此组合文件另存为.csv。然后,我将所有正确组合的文件移动到另一个文件夹中,仅包含当前组合的文件以及路径中未正确加载的文件。然后重新运行未指定colClasses的函数。我将所有内容组合到一个脚本中,以期减少混乱:
#First Initial run without colClasses
multmerge = function(mypath){
filenames = list.files(path = mypath, full.names = TRUE)
rbindlist(lapply(filenames,function(i) tryCatch(fread(i),
error = function(e) {
cat("\nError reading in file:",i,"\t") #Identifies problem files by name
message(e) #Prints error message without stopping loop
list(ERROR=i) #Adds a placeholder column so rbindlist will execute
})), #End of tryCatch and lapply
fill = TRUE) #rbindlist arguments
} #End of function
#You should get the original error message and identify the filename.
dataframe = multmerge(path)
#Delete placeholder column and extra rows
#You will get as many extra rows as you have problem files -
#most likely just the one with column 25 or any others that had that same issue with column 25.
#Note the out of bounds error message will probably go away with the colClasses argument pulled out.)
#Save this cleaned file to something like: fwrite(dataframe,"CurrentCombinedData.csv")
#Move all files but problem file into new folder
#Now you should only have the big one and only one in your path.
#Rerun the function but add the colClasses argument this time
#Second run to accommodate the problem file(s) - We know the column 25 error this time but maybe in the future you will have to adapt this by adding the appropriate column.
multmerge = function(mypath){
filenames = list.files(path = mypath, full.names = TRUE)
rbindlist(lapply(filenames,function(i) tryCatch(fread(i,colClasses = list(character = c(25))),
error = function(e) {
cat("\nError reading in file:",i,"\t") #Identifies problem files by name
message(e) #Prints error message without stopping loop
list(ERROR=i) #Adds a placeholder column so rbindlist will execute
})), #End of tryCatch and lapply
fill = TRUE) #rbindlist arguments
} #End of function
dataframe2 = multmerge(path)
现在我们知道错误的根源是我们可以在colClasses中指定的第25列。如果运行代码,并且在不同的列上收到相同的错误消息,只需在25之后添加该列的编号。一旦输入了数据框,我将检查该列中发生了什么(或其他任何情况,如果必须添加其他列)。可能其中一个文件存在数据输入错误,或者NA值的编码不同。这就是为什么我说首先要将该列首先转换为character
的原因,因为与首先转换为numeric
相比,您丢失的信息更少。
一旦没有错误,请始终将清理后的合并data.table写入文件夹中包含的csv,并始终将合并后的单个文件移动到另一个文件夹中。这样,当您添加新文件时,您将仅将一个大文件和几个其他文件组合在一起,以便将来可以轻松地查看正在运行的文件。只需记下哪些文件给您带来了麻烦以及哪些列会给您带来麻烦。那有意义吗?
由于文件通常是如此特质,因此您必须灵活一些,但是这种工作流程方法应使识别问题文件变得容易,并在功能中添加需要添加的内容以使其正常工作。基本上将已处理的文件存档,并跟踪第25列之类的异常,并在活动路径中保留最新的合并文件和未一起处理的文件。希望有帮助,祝你好运!