【问题标题】:Handling NULL values in SQL table when reading table in R在 R 中读取表时处理 SQL 表中的 NULL 值
【发布时间】: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”单元格被转换为&lt;NA&gt;,而不是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&lt;NA&gt; 之间没有(真正的)区别。后者只是 R 在字符变量的情况下如何打印 NA 值,以便与其他字符串区分开来。 R 执行此操作以及 na.string = "NULL" 导致此行为的事实强烈表明您的数据库中的 NULL 值实际上是字符串。因此,具有此“NULL”值的“数字”列将作为字符变量导入。

标签: r null na rodbc


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多