Обработка значений NULL в таблице SQL при чтении таблицы в R

Я читаю таблицу SQL в R, используя следующий запрос:

введите здесь описание изображения

data = sqlQuery(con, "select * from Quant.dbo.Indiv_data where Date > '19020101'", stringsAsFactors = FALSE, as.is = TRUE, na.string = "NULL", nullstring = "NA")

Использование as.is заключается не в приведении исходных типов столбцов, а в том, чтобы оставить типы столбцов таблицы SQL как есть. Единственная проблема заключается в том, что ячейки NULL в таблице SQL не обрабатываются должным образом, и я получаю следующий результат:

                      Date  issueid    ReturnBA          VAL           EQ          EFF        SIZE FSCR MSCR          SY
 1 1984-12-31 00:00:00.000 00101601  .136539672 45.200000000 71.400000000 47.750000000 1.295611077 <NA> <NA>  .019447467
 2 1984-12-31 00:00:00.000 00105401  .023985560 57.800000000 48.800000000 18.500000000 2.296439211 <NA> <NA> -.005433357
 3 1984-12-31 00:00:00.000 00109801 -.094036769 60.200000000 56.800000000 79.200000000 1.858392810 <NA> <NA> -.451707020
 4 1984-12-31 00:00:00.000 00112401 -.006317470 46.400000000 64.800000000 54.250000000 1.900126698 <NA> <NA>  .009264280
 5 1984-12-31 00:00:00.000 00116601  .124830071         <NA> 76.200000000 48.500000000 2.070191229 <NA> <NA>        <NA>
 6 1984-12-31 00:00:00.000 00117801  .010923909 25.500000000 29.000000000 40.666666667 2.200806054 <NA> <NA> -.005433421

Обратите внимание, что ячейки NULL преобразуются в <NA> вместо NA. Чтобы попытаться справиться с этим случаем, я попробовал следующее:

 data = sqlQuery(con, "select * from Quant.dbo.Indiv_data where Date > '19020101'",
  stringsAsFactors = FALSE, as.is = TRUE, na.string = "NULL", nullstring = "NA")

Однако при этом каждой ячейке NULL присваивается строка NA, а не символ NA. Другими словами, если вы возьмете пример data$VAL[5], который изначально был NULL в таблице SQL, и сделаете следующее:

is.na(data$VAL[5]) вы получаете FALSE, но при выполнении data$VAL[5] == "NA" получаете TRUE

Как я могу сделать все NULL ячеек в таблице SQL NA в фрейме данных в R, используя as.is в sqlQuery()?

Спасибо,


person Mayou    schedule 03.10.2013    source источник
comment
Ваш снимок экрана, кажется, подразумевает, что значения NULL в вашей базе данных на самом деле не NULL, а строки NULL. Это правильно?   -  person joran    schedule 03.10.2013
comment
Что вы подразумеваете под строкой NA? ты имеешь в виду NA_character_?   -  person agstudy    schedule 03.10.2013
comment
Под строкой NA я подразумеваю NA, а не символ NA   -  person Mayou    schedule 03.10.2013
comment
@ Джоран Я считаю, что на самом деле это символ NULL, а не строка.   -  person Mayou    schedule 03.10.2013
comment
Итак, нет (реальной) разницы между NA и <NA>. Последнее — это просто то, как R печатает значение NA в случае символьной переменной, чтобы отличить ее от других строк. Тот факт, что R сделал это и что na.string = "NULL" вызвало такое поведение, убедительно свидетельствует о том, что значения NULL в вашей базе данных на самом деле являются строками. Таким образом, числовые столбцы с этими значениями NULL импортируются как символьные переменные.   -  person joran    schedule 03.10.2013
comment
Это очень странно, так как столбец VAL, например, имеет числовой (18,9) тип, но импортируется в R как символьный столбец. Как так получилось, даже если я указал as.is?   -  person Mayou    schedule 03.10.2013
comment
Может быть. Я бы посчитал использование строки NULL для представления отсутствующих данных в столбце базы данных гораздо более серьезной проблемой.   -  person joran    schedule 03.10.2013
comment
Вы только что заставили меня понять, что реальная проблема заключается в том, что все мои числовые столбцы в SQL были импортированы как столбцы символов. Как я могу это решить?   -  person Mayou    schedule 03.10.2013
comment
Единственное объяснение, которое имеет какой-либо смысл, заключается в том, что вы на самом деле ошибаетесь в структуре вашей базы данных. Если бы столбцы были числовыми, R импортировал бы их как таковые.   -  person joran    schedule 03.10.2013
comment
Что ж, я смотрю, пока мы говорим, на свою таблицу SQL, и я явно вижу, что мои первые два столбца — это Datetime и varchar (255), а все остальные столбцы — numeric(18,9). Я полагаю, что не могу использовать as.is должным образом.. вы думаете, что это так?   -  person Mayou    schedule 03.10.2013
comment
Нет, я думаю, вы ошибаетесь насчет того, что находится в вашей базе данных. Мы уже установили, что значения NULL на самом деле являются строками в вашей базе данных.   -  person joran    schedule 03.10.2013
comment
... если мы не ошибаемся в том, что находится в вашей базе данных. Скриншоты не очень информативны, поэтому сложно сказать. Что произойдет, если вы просто опустите аргумент as.is и позволите R выбрать тип для каждого столбца?   -  person joran    schedule 03.10.2013
comment
Если я не использую as.is, числовые столбцы остаются числовыми. Я не ошибся в том, что находится в моей таблице, и наконец нашел решение: указать только as.is для столбцов, которые вы хотите сделать character или Date, и FALSE для остальных. Если я полностью исключаю as.is, все столбцы будут в порядке, за исключением второго столбца: этот столбец является столбцом символов, но R отобразит его как числовой.   -  person Mayou    schedule 03.10.2013


Ответы (1)


Хитрость в том, что кажется, что as.is преобразует все столбцы (кроме столбца Date) в столбцы character. Следовательно, R печатает <NA> как нулевой символ для векторов/столбцов символов.

Решение состоит в том, чтобы указать as.is только для первых двух столбцов и позволить R позаботиться об остальных типах столбцов. В этом случае R соответствующим образом преобразует остальные столбцы в числовые и назначит NA в качестве нулевого символа для эквивалентных пустых ячеек в SQL.

person Mayou    schedule 03.10.2013