使用rbindlist时遇到错误:结果的第25列被确定为integer64,但maxType =='Character'!= REALSXP

时间:2019-04-28 08:22:47

标签: r data.table rbindlist

我使用以下功能将目录中的所有.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文件上工作...我不确定发生了什么更改以及错误消息的含义。

1 个答案:

答案 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列之类的异常,并在活动路径中保留最新的合并文件和未一起处理的文件。希望有帮助,祝你好运!