неправильное чтение структуры данных в кавычках - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть данные файла 5 G для загрузки. fread кажется быстрым способом их загрузки, но он неправильно читает все мои структуры данных. Похоже, что это кавычки, которые приводят к проблеме.

# Codes. I don't know how to put raw csv data here.   
dt<-fread("data.csv",header=T)
dt2<-read.csv("data.csv",header=T)
str(dt)
str(dt2)

Это вывод. Все структуры данных переменных fread являются символами независимо от того, является ли это числом или числом.

enter image description here enter image description here

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Похоже, что команда fread обнаружит тип в определенном столбце, а затем назначит для этого столбца тип низший , который он может, на основе содержимого этого столбца. Из фред документации:

Выборка из 1000 строк используется для определения типов столбцов (100 строк от 10 баллов). Самый низкий тип для каждого столбца выбирается из упорядоченный список: логический, целое, целое, 64, двойной, символ. This позволяет fread распределять точное количество строк, столбцы правильного типа, один раз. Файл может конечно еще содержат данные более высокого типа в строках вне выборки. В этом В этом случае типы столбцов увеличиваются при чтении, а данные считываются приведены предыдущие строки.

Это означает, что если у вас есть столбец с в основном числовыми значениями типа, он может назначить столбец как numeric, но затем, если он найдет какие-либо значения типа character позже, он приведет к тому, что все прочитанное до этой точки будет character тип.

Вы можете прочитать об этих преобразованиях типов здесь , но, судя по всему, попытка преобразовать столбец character в numeric для значений, которые не являются числовыми, приведет к эти значения преобразуются в NA, или двойное значение может быть преобразовано в целое число, что приводит к потере точности.

С такой потерей точности вы можете согласиться, но fread не позволит вам выполнить это преобразование, используя colClasses. Возможно, вы захотите войти и удалить нечисловые значения самостоятельно.

0 голосов
/ 27 апреля 2018

Любопытно, что fread не использовал числовой для столбца id, может быть, некоторые записи содержат нечисловые значения?

В документации предлагается использовать параметр colClasses.

dt <- fread("data.csv", header = T, colClasses = c("numeric", "character"))

В документации есть предупреждение за использование этого параметра:

Символьный вектор классов (именованных или неназванных), как read.csv. Или именованный список векторов имен столбцов или номеров, см. Примеры. colClasses in fread предназначен для редких переопределений, а не для рутинного использования. fread будет выдвигать столбец более высокого типа только по запросу colClasses. Это не понизит столбец до более низкого типа, так как это приведет к NA. Вы должны сами принудительно применять такие столбцы, если вам действительно нужна потеря данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...