4

如果我尝试从 SQL 中获取平均c(NA, NA, 3, 4, 5, 6, 7, 8, 9, 10)使用AVG量,我得到的值为 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 中)来完成?

4

3 回答 3

7

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

SELECT AVG(col1)
FROM file
WHERE col1 IS NOT \"NA\"
于 2012-01-14T00:45:25.987 回答
2

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

d <- read.csv("my.na.txt")
sqldf("SELECT AVG(col1) FROM d") # 6.5
于 2012-01-14T01:00:24.780 回答
0

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

于 2021-04-21T12:17:32.830 回答