我正在使用以下查询读取R中的SQL表:
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}}?
谢谢,
答案 0 :(得分:0)
诀窍在于as.is
似乎将所有列(Date列除外)转换为character
列。因此,R将<NA>
打印为字符向量/列的空符号。
解决方案是仅为前两列指定as.is
,让R处理其他列类型。在这种情况下,R会将其余列适当地转换为数字,并为SQL中的等效空单元格指定NA
作为空符号。