我正在使用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
答案 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")