在R中读取表时,在SQL表中处理NULL值

时间:2013-10-03 13:51:02

标签: r null na rodbc

我正在使用以下查询读取R中的SQL表:

enter image description here

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表的列类型。唯一的问题是SQL表中的“NULL”单元格无法正确处理,我得到以下结果:

                      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]的例子,它在SQL表中最初为NULL,并执行以下操作:

is.na(data$VAL[5])你得到FALSE但是在做的时候 data$VAL[5] == "NA" TRUE获得NULL

NA中使用as.is时,如何在R中的数据框中将SQL表中的所有sqlQuery()单元格设为{{1}}?

谢谢,

1 个答案:

答案 0 :(得分:0)

诀窍在于as.is似乎将所有列(Date列除外)转换为character列。因此,R将<NA>打印为字符向量/列的空符号。

解决方案是仅为前两列指定as.is,让R处理其他列类型。在这种情况下,R会将其余列适当地转换为数字,并为SQL中的等效空单元格指定NA作为空符号。