Проблемы импорта CSV-файла / преобразования из целого числа в удвоение в R - PullRequest
6 голосов
/ 05 декабря 2011

Сегодня я наконец решил начать восхождение по крутой кривой обучения Р.Я потратил несколько часов, и мне удалось импортировать мой набор данных и сделать несколько других базовых вещей, но у меня возникли проблемы с типом данных: столбец, содержащий десятичные дроби, импортируется как целое число, а преобразование в двойное число изменяетзначения .

Пытаясь получить небольшой CSV-файл для размещения здесь в качестве примера, я обнаружил, что проблема возникает только тогда, когда файл данных слишком большой (мой оригинальный файлматрица 1048418 на 12, но даже с «только» 5000 строк у меня та же проблема. Когда у меня есть только 100, 1000 или даже 2000 строк, столбец корректно импортируется как двойной).

Здесь - это меньший набор данных (все еще 500 КБ, но, опять же, если набор данных небольшой, проблема не реплицируется).Код:

> ex <- read.csv("exampleshort.csv",header=TRUE)
> typeof(ex$RET)
[1] "integer"

Почему столбец возвратов импортируется как целое число, когда файл большой, если он явно имеет тип double?

Хуже всего то, что если япопытайтесь преобразовать его в удвоение, значения будут изменены

> exdouble <- as.double(ex$RET)
> typeof(exdouble)
[1] "double"

> ex$RET[1:5]
[1] 0.005587  -0.005556 -0.005587 0.005618  -0.001862
2077 Levels: -0.000413 -0.000532 -0.001082 -0.001199 -0.0012 -0.001285 -0.001337 -0.001351 -0.001357 -0.001481 -0.001486 -0.001488 ... 0.309524

> exdouble[1:5]
[1] 1305  321  322 1307   41

Это не единственный столбец, который импортирован неправильно, но я подумал, что если я найду решение для одного столбца, я смогу отсортироватьдругие вышли.Вот еще немного информации:

> sapply(ex,class)
PERMNO      DATE    COMNAM     SICCD       PRC       RET      RETX    SHROUT    VWRETD    VWRETX    EWRETD    EWRETX 
"integer" "integer"  "factor" "integer"  "factor"  "factor"  "factor" "integer" "numeric" "numeric" "numeric" "numeric" 

Они должны быть в следующем порядке: целое число, дата, строка, целое число, двойное число, двойное число, двойное число, целое число, двойное число, двойное число, двойное число (двойное число типовнеправильно, но, надеюсь, вы поймете, что я имею в виду)

1 Ответ

7 голосов
/ 05 декабря 2011

См. Справку для read.csv: ?read.csv. Вот соответствующий раздел:

colClasses: character.  A vector of classes to be assumed for the
          columns.  Recycled as necessary, or if the character vector
          is named, unspecified values are taken to be ‘NA’.

          Possible values are ‘NA’ (the default, when ‘type.convert’ is
          used), ‘"NULL"’ (when the column is skipped), one of the
          atomic vector classes (logical, integer, numeric, complex,
          character, raw), or ‘"factor"’, ‘"Date"’ or ‘"POSIXct"’.
          Otherwise there needs to be an ‘as’ method (from package
          ‘methods’) for conversion from ‘"character"’ to the specified
          formal class.

          Note that ‘colClasses’ is specified per column (not per
          variable) and so includes the column of row names (if any).

Удачи вам в изучении R. Это сложно, но очень весело после того, как вы пройдете первые несколько этапов (которые, я признаю, занимают некоторое время).

попробуйте это и исправьте остальные соответственно:

ex <- read.csv("exampleshort.csv",header=TRUE,colClasses=c("integer","integer","factor","integer","numeric","factor","factor","integer","numeric","numeric","numeric","numeric"), na.strings=c("."))

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

na.strings должно быть указано. См. Следующий раздел в ?read.csv:

 na.strings: a character vector of strings which are to be interpreted
      as ‘NA’ values.  Blank fields are also considered to be
      missing values in logical, integer, numeric and complex
      fields.

Для справочных целей (это не следует использовать в качестве решения, поскольку наилучшим решением является правильный импорт данных за один шаг): RET не было импортировано как целое число. Он был импортирован как factor. Для дальнейшего использования, если вы хотите преобразовать factor в numeric, используйте

new_RET <-as.numeric(as.character(ex$RET))

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