Ошибка при использовании rbindlist: столбец 25 результата определен как integer64, но maxType == 'Character'! = REALSXP - PullRequest
0 голосов
/ 28 апреля 2019

Я использовал следующую функцию для объединения всех файлов .csv в моем каталоге в один фрейм данных:

multmerge = function(mypath){
filenames = list.files(path = mypath, full.names = TRUE)
rbindlist(lapply(filenames,fread),fill = TRUE) }

dataframe = multmerge(path)

Этот код выдает эту ошибку:

Ошибка в списке rbindlist (lapply (имена файлов, fread), fill = TRUE): внутренняя ошибка: столбец 25 результата определен как integer64, но maxType == 'character'! = REALSXP

Код работал с теми же CSV-файлами раньше ... Я не уверен, что изменилось и что означает сообщение об ошибке.

1 Ответ

0 голосов
/ 29 апреля 2019

Итак, просматривая документацию по fread, я заметил, что есть опция integer64, так что вы имеете дело с целыми числами больше 2 ^ 31?

РЕДАКТИРОВАТЬ: я добавил tryCatch, который будет печатать отформатированное сообщение на консоли, указывающее, какие файлы вызывают ошибку с фактическим сообщением об ошибке. Однако для того, чтобы rbindlist затем выполнялся над обычными файлами, вам нужно создать фиктивный список, который создаст дополнительный столбец с именем ERROR, который будет содержать NA во всех строках, кроме нижнего (ых), в котором будет указано имя файла проблемы. значение (ы).

Я предлагаю после того, как вы выполните этот код один раз, удалите столбец ОШИБКА и дополнительные строки из таблицы data.table, а затем сохраните этот объединенный файл как .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)

Теперь мы знаем, что источником ошибки является столбец 25, который мы можем указать в colClasses. Если вы запускаете код и получаете то же сообщение об ошибке для другого столбца, просто добавьте номер этого столбца после 25. После того, как вы введете фрейм данных, я проверю, что происходит в этом столбце (или любых других, если вам нужно добавить другие столбцы). Возможно, произошла ошибка ввода данных в один из файлов или другая кодировка значения NA. Вот почему я говорю сначала преобразовать этот столбец в character, потому что вы потеряете меньше информации, чем вначале numeric.

Если у вас нет ошибок, всегда записывайте очищенный объединенный файл data.table в файл csv, который содержится в вашей папке, и всегда перемещайте отдельные файлы, которые были объединены, в другую папку. Таким образом, когда вы добавляете новые файлы, вы будете комбинировать только один большой и несколько других, чтобы в будущем было легче увидеть, что происходит. Просто ведите записи о том, какие файлы доставили вам неприятности и какие столбцы. Имеет ли это смысл?

Поскольку файлы часто настолько уникальны, вам придется проявить гибкость, но такой подход к рабочему процессу должен упростить идентификацию проблемных файлов и добавление того, что вам нужно добавить во фред, чтобы он работал. В основном архивируйте файлы, которые были обработаны, и отслеживайте исключения, такие как столбец 25 один, и сохраняйте самый текущий объединенный файл и те, которые не были обработаны вместе, в активном пути. Надеюсь, что это помогает и удачи!

...