Dưới đây là một hàm được vectơ hóa, không và NA để tính giá trị trung bình hình học trong R. Việc mean
tính toán chi tiết liên quan length(x)
là cần thiết cho các trường hợp x
chứa các giá trị không dương.
gm_mean = function(x, na.rm=TRUE){
exp(sum(log(x[x > 0]), na.rm=na.rm) / length(x))
}
Cảm ơn @ ben-bolker đã ghi nhận quá trình na.rm
chuyển qua và @Gregor để đảm bảo rằng nó hoạt động chính xác.
Tôi nghĩ rằng một số nhận xét có liên quan đến sự tương đương sai của các NA
giá trị trong dữ liệu và số không. Trong ứng dụng, tôi đã nghĩ rằng chúng giống nhau, nhưng tất nhiên điều này nói chung không đúng. Do đó, nếu bạn muốn bao gồm việc truyền các số không tùy chọn và xử lý theo length(x)
cách khác trong trường hợp NA
loại bỏ, thì sau đây là một thay thế dài hơn một chút cho hàm trên.
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))
}
}
Lưu ý rằng nó cũng kiểm tra bất kỳ giá trị âm nào và trả về một giá trị thông tin và phù hợp hơn NaN
tôn trọng rằng giá trị trung bình hình học không được xác định cho các giá trị âm (mà là cho số không). Cảm ơn những người bình luận đã ở lại trường hợp của tôi về điều này.