Почему импорт данных в R с функцией fread вызывает специфическую ошибку сравнения типов данных, приводящую к дальнейшим проблемам фильтрации - PullRequest
1 голос
/ 18 февраля 2020

Я использую data.table :: fread для импорта большого набора данных с 7,5 миллионами строк и 56 столбцами. Я указываю переменные классы для определенных переменных, которые должны быть прочитаны как символ, используя аргумент colClasses. После импорта данные выглядят нормально, а классы столбцов сделаны правильно.

Однако при фильтрации данных возникают проблемы. К сожалению, я не могу построить пример здесь, потому что я не знаю точно, в чем проблема.

Но в основном ошибки возникают, когда я использую двоичные логики c для фильтрации некоторых строк.

Ниже коды показывают ошибку:

Прежде всего, столбец 'id' читается как символ, и str / glimpse / class / mode все подтверждают это. Тогда почему это происходит:

mydata[mydata$id == 01005845, year]
[1] 2015 2014 2013 2012

mydata[mydata$id == "01005845", year]
[1] 2011 2010 2009 2008 2007 2006 2005

Для дальнейшего тестирования я перепроверил класс данных для этих конкретных c наблюдений, которые по-прежнему отображаются в виде символов:

typeof(mydata[mydata$id == 01005845, id])
[1] "character"

glimpse(mydata[mydata$id == 01005845, id])
chr [1:4] "01005845" "01005845" "01005845" "01005845"

mydata[mydata$id == 01005845, id] == 01005845
TRUE TRUE TRUE TRUE

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

В целом этот символ - несоответствие целочисленного сравнения портит весь мой анализ. Мои фильтрации не работают должным образом, и выходные данные сильно страдают.

Я ценю вашу помощь. Береги себя :)

1 Ответ

2 голосов
/ 18 февраля 2020

Я думаю, это потому, что 01005845 != "01005845"

Если вы наберете 01005845 в консоли, вы получите

>01005845
#[1] 1005845

01005845 - это число, а 0 в начале число не имеет никакого значения, следовательно, оно удаляется. Эта проблема связана не с data.table или fread, а с общей проблемой обработки чисел.

Поскольку столбец id является символом, вы должны использовать

mydata[id == "01005845", year]

Этот небольшой пример демонстрирует проблему

library(data.table)
df <- data.table(a = c('2011', '02011', '2011', '2012', '02011'), b = letters[1:5])

df[a == 02011, ]
#      a b
#1: 2011 a
#2: 2011 c

df[a == "02011", ]
#       a b
#1: 02011 b
#2: 02011 e
...