刚遇到一个有意思的问题,如何用R计算几何平均数。如果数字少,简单,计算很容易,直观上,先用prod
函数连乘,然后开方即可。
但我的数值大,连乘几十个之后R结果就是INF了,然后开方就还是INF,算不出来!
聪明人就会动脑筋了,转个弯,先取对数,再指数化!Stackoverflow上的解答让我大开眼界,下面给一个通用的计算函数:
代码语言:javascript复制gm_mean = function(x, na.rm=TRUE, zero.propagate = FALSE){
if(any(x < 0, na.rm = TRUE)){
return(NaN)
}
if(zero.propagate){
if(any(x == 0, na.rm = TRUE)){
return(0)
}
exp(mean(log(x), na.rm = na.rm))
} else {
exp(sum(log(x[x > 0]), na.rm=na.rm) / length(x))
}
}
最后一个参数指定是否容忍0的存在。