【问题标题】:NA values using sqldf使用 sqldf 的 NA 值
【发布时间】:2012-02-10 03:52:20
【问题描述】:

如果我尝试使用 SQL 中的 AVG 来获得 c(NA, NA, 3, 4, 5, 6, 7, 8, 9, 10) 的平均值,我会得到 5.2,而不是预期的 6.5。

# prepare data and write to file
write.table(data.frame(col1 = c(NA, NA, 3:10)),
        "my.na.txt", row.names = FALSE)

mean(c(NA, NA, 3:10), na.rm = TRUE) # 6.5

my.na <- read.csv.sql("my.na.txt", sep = " ",
        sql = "SELECT AVG(col1) FROM file") # 5.2

# this is identical to
sum(3:10)/10

unlink("my.na.txt") # remove file

这让我相信 sql(df) 将 NA 值视为零。是否可以在 SQL 调用中忽略(排除)NA 值,因为它可以使用 na.rm 参数(在 R 中)来完成?

【问题讨论】:

  • ?sqldf 说:“sqldf 用于将文件传输到数据库的dbWriteTable/sqliteImportFile 例程旨在提高速度,它们不如read.table 灵活。”尽管可能不是理想的解决方案,但read.csv.sqlfilter 参数可用于在将NA 行读入SQLite 之前过滤掉它们。 ?sqldf 和 sqldf 主页上有一些 filter 参数的示例:sqldf.googlecode.com

标签: sql r sqldf


【解决方案1】:

供日后参考。我在研究问题时发现了这个线程,可以在 NA 的定义中找到解决方案。转移到 SQLite 时,NA 会被转换为 NULL,然后你可以使用 IS NULL 或 IS NOT NULL 来排除它们。

【讨论】:

    【解决方案2】:

    修改您的查询以忽略 NA 值:

    SELECT AVG(col1)
    FROM file
    WHERE col1 IS NOT \"NA\"
    

    【讨论】:

    • 哼,我用SELECT AVG(col1) FROM file WHERE col1 IS NOT NULL 还是得到5.2。
    • 数据库中的值是 N/A 还是 NULL? (从 col1 不为空的文件中选择 col1)[显示 NA 吗?] 或(从 col1 'NA' 的文件中选择 Col1 [显示 NA 吗?]
    • 使用SELECT AVG(col1) FROM file WHERE col1 IS NOT \"NA\" 效果很好而且很花哨。诀窍是引用了 NA,您需要转义它们。谢谢你们的提示。
    【解决方案3】:

    问题在于read.csv.sql 函数无法识别缺失值,并将它们转换为零,而不是NULL。 如果您首先将数据加载到 data.frame 中,然后才调用 sqldf,则不会发生这种情况。

    d <- read.csv("my.na.txt")
    sqldf("SELECT AVG(col1) FROM d") # 6.5
    

    【讨论】:

    • 在我的情况下,将数据加载到 data.frame 是不可能的。
    猜你喜欢
    • 1970-01-01
    • 2020-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-22
    • 2020-08-15
    • 2019-05-30
    • 2020-08-22
    相关资源
    最近更新 更多