【发布时间】:2013-10-10 06:13:09
【问题描述】:
我正在使用以下查询读取 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 单元格设置为 string NA 而不是 symbol NA。
换句话说,如果你以data$VAL[5]为例,在SQL表中最初为NULL,然后执行以下操作:
is.na(data$VAL[5]) 你得到FALSE 但是当你这样做时
data$VAL[5] == "NA" 你得到TRUE
如何使 SQL 表中的所有 NULL 单元格在 R 的数据框中成为 NA,同时在 sqlQuery() 中使用 as.is?
谢谢,
【问题讨论】:
-
您的屏幕截图似乎暗示您数据库中的“NULL”值实际上不是
NULL,而是字符串“NULL”。对吗? -
字符串 NA 是什么意思?你的意思是
NA_character_? -
字符串 NA,我的意思是“NA”,而不是符号 NA
-
@Joran 我相信实际上是符号
NULL,而不是字符串。 -
所以,
NA和<NA>之间没有(真正的)区别。后者只是 R 在字符变量的情况下如何打印 NA 值,以便与其他字符串区分开来。 R 执行此操作以及na.string = "NULL"导致此行为的事实强烈表明您的数据库中的 NULL 值实际上是字符串。因此,具有此“NULL”值的“数字”列将作为字符变量导入。