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 meantính toán chi tiết liên quan length(x)là cần thiết cho các trường hợp xchứ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.rmchuyể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 NAgiá 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 NAloạ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 NaNtô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.