2014-05-19 27 views
1

非常簡單的問題,我敢肯定它已被回答,我只是錯誤地措辭,但我想計算一個包括NA值的數字向量的均值,下面是一個示例:如何統計NAs的平均值計算

dummy<-c(1,2,NA, 3)

與此我可以使用與na.rm = T意味着和接收的2的平均值,但我希望收到的是6/4的平均值,包括NA值作爲佔位符,其會返回1.5。

+6

'sum(dummy,na.rm = TRUE)/ length(dummy)'?? –

+3

也可以工作,只是使所有的'NA's 0 –

+0

@BenBolker什麼時候會給出不同的答案? –

回答

3

只需將NA值與0臨時交換即可。

mean(ifelse(is.na(dummy),0,dummy)) 
3

使用sumlength

> sum(dummy, na.rm=TRUE)/length(dummy) 
[1] 1.5 
3

由於有很多方法可以做到這一點嘗試,在這裏不用另一種解決方案:

mean(replace(dummy, is.na(dummy), 0)) ## 1.5 
[1] 1.5 

只是出於好奇,最有效的解決方案似乎是Jilber的總和/長度:

bigdummy <- rnorm(1000) 
bigdummy[sample(1:length(bigdummy), 100)] <- NA 

library(microbenchmark) 
mean_length <- function(x) sum(x, na.rm=TRUE)/length(x) 
mean_replace <- function(x) mean(replace(x, is.na(x), 0)) 
mean_ifelse <- function(x) mean(ifelse(is.na(x),0,x)) 


microbenchmark(mean_length(bigdummy), 
       mean_replace(bigdummy), 
       mean_ifelse(bigdummy), 
       times=1000L) 


    Unit: microseconds 
        expr  min  lq median  uq  max neval 
    mean_length(bigdummy) 4.033 4.400 5.499 5.866 109.976 1000 
mean_replace(bigdummy) 25.661 27.128 28.594 29.327 198.690 1000 
    mean_ifelse(bigdummy) 142.602 144.802 145.902 152.500 3405.209 1000