如果数据包含NA / NULL,如何在聚合函数中强制NA / NULL

时间:2014-07-24 14:50:45

标签: r sqlite sqldf

我正在使用sqldf包来聚合基于复杂条件的数据帧。 sqlite的标准行为是在聚合时忽略NULL值(例如计算平均值),这与标准R行为不同(如果数据包含NA值,则结果为NA,除非设置了na.rm = T)。

有没有办法强制sqlite与R具有相同的行为(如果数据包含NA / NULL,则输出NA或NULL)?

简单示例:

library(sqldf)
data <- data.frame(name=c("v1","v2","v3"),value=c(5,3,NA))
mean(data$value)
> [1] NA

sqldf("SELECT avg(value) FROM data")
> avg(value)
> 1   4

2 个答案:

答案 0 :(得分:1)

如果有任何NULL,您可以添加一个抛出所有行的WHERE子句:

SELECT avg(value)
FROM data
WHERE NOT EXISTS (SELECT 1
                  FROM data
                  WHERE value IS NULL)

答案 1 :(得分:0)

如果count(value)没有空值,

count(*)以下将等于value

sqldf("select 
         case when count(value) = count(*) then avg(value) else null end as value
         from data")

这也可以写成:

avgNA <- function(x) {
    x <- deparse(substitute(x))
    sprintf("case when count(%s) = count(*) then avg(%s) else null end", x, x)
}
fn$sqldf("select `avgNA(value)` as value from data")