使用sqldf的NA值

时间:2012-01-14 00:42:58

标签: sql r sqldf

如果我尝试从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中)完成?

3 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

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