使用NA权重的R中的加权平均值

Jai*_*ain 5 r mean na

 a=c(1,2,NA,4)
 b=c(10,NA,30,40)
 weighted.mean(a,b,na.rm = T)
Run Code Online (Sandbox Code Playgroud)

上面的代码给了我NA答案,我认为na.rm仅忽略向量a中的NA值,而不忽略b中的NA值。如何忽略向量b或特定权重中的NA。我只是无法将NA更改为0,我知道这可以解决问题,但需要在公式本身中进行调整。

web*_*ebb 6

我调整了 Mhairi 的代码,不使用 data.frame 也不使用 na.omit:

weighted_mean = function(x, w, ..., na.rm=F){
  if(na.rm){
    keep = !is.na(x)&!is.na(w)
    w = w[keep]
    x = x[keep]
  }
  weighted.mean(x, w, ..., na.rm=F)
}
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是,R 内置weighted.mean na.rm=T 无法处理 NA 权重。只是浪费了几个小时才发现这一点。

编辑:这里还有一个 data.table 方式,以防有人想要计算分组加权平均值:

# mean of column a weighted by b grouped by g1 and g2
DT[!is.na(b),.(wm=weighted.mean(a,b,na.rm=T)),.(g1,g2)]
# wm will be NA for a group iff all rows for the group have
# at least one of a or b NA
Run Code Online (Sandbox Code Playgroud)


Mha*_*ill 5

这是我最终为解决此问题而编写的功能:

weighted_mean <- function(x, w, ..., na.rm = FALSE){

  if(na.rm){

    df_omit <- na.omit(data.frame(x, w))

    return(weighted.mean(df_omit$x, df_omit$w, ...))

  } 

  weighted.mean(x, w, ...)
}
Run Code Online (Sandbox Code Playgroud)