Как указать colClasses при чтении очень большого CSV-файла в R с помощью read.table.ffdf?

Я пытаюсь прочитать очень большой файл .csv размером около 20 ГБ, используя функцию read.table.ffdf() в пакете "ff", но не могу указать параметр colClasses в read.csv().

Я должен указать параметр colClasses, потому что некоторые столбцы в файле помечены как очень длинные целые числа, например. с 11 цифрами. Например, две строки в файле

86246,205,17,1719,104116343,8435,2013-03-13,12,OZ,1,2.59
86246,205,17,1719,10800749282,8435,2013-03-13,12,OZ,1,2.59 

Целое число 10800749282 слишком велико для типа "целое число" и может обрабатываться только как "числовое" или "символьное". Но значение 104116343 в приведенной выше строке недостаточно велико, поэтому R по умолчанию будет рассматривать этот столбец как «целочисленный».

Я попробовал следующее, но получил ошибку. кто-нибудь знает, как решить эту проблему? Высоко ценится!

dat <- read.table.ffdf(file="file.csv", FUN = "read.csv", na.strings = "", colClasses="character")

Ошибка в ff(initdata = initdata, длина = длина, уровни = уровни, упорядоченный = упорядоченный, : vmode 'персонаж' не реализован


person user3574507    schedule 25.04.2014    source источник
comment
Это значение не превышает верхний предел для длинных целых чисел. Этот верхний предел устанавливается 53-битной мантиссой в числовом классе. 10800749282L < 2^53-1 [1] TRUE   -  person IRTFM    schedule 26.04.2014
comment
Однако он прав в том, что «целочисленный» тип в R не будет обрабатывать 10800749282L (.Machine$integer.max — это 2147483647), поэтому, если read.table попытается прочитать этот столбец как integer вместо numeric из-за первой строки, это проблема. Что я не уверен в @user3574507, почему бы не указать colClasses=numeric?   -  person sebkopf    schedule 26.04.2014


Ответы (1)


Как следует из вашей ошибки, в среде ff не реализован тип данных «символ». Все символы следует рассматривать как факторы. Предполагая, что ваш файл содержит x количество столбцов, работает следующее:

dat <- read.csv.ffdf(NULL, file="file.csv", na.strings = "", colClasses=rep("factor", x))

Однако вам, вероятно, нужно не импортировать все данные как факторы, так как это крайне неэффективно. Просто импортируйте все свои числовые данные как «числовые». Предположим, что ваши первые 5 столбцы являются числовыми, а остальные 3 – символами:

dat <- read.csv.ffdf(NULL, file="file.csv", na.strings = "", colClasses=c(rep("numeric", 5), rep("factor", 3)))

person Audrey    schedule 01.07.2014