Итак, просматривая документацию по 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 один, и сохраняйте самый текущий объединенный файл и те, которые не были обработаны вместе, в активном пути. Надеюсь, что это помогает и удачи!