R语言 使用NA权重的加权平均值

g9icjywg  于 2023-01-28  发布在  其他
关注(0)|答案(3)|浏览(163)
a=c(1,2,NA,4)
 b=c(10,NA,30,40)
 weighted.mean(a,b,na.rm = T)

上面的代码给出了NA作为答案,我认为na.rm只忽略了vector a中的NA值,而没有忽略b中的NA值。我怎么能忽略vector b中的NA或权重呢?我只是不能将NA更改为0,我知道这样做会很有效,但要在公式本身中寻找调整。

oymdgrw7

oymdgrw71#

下面是我为解决这个问题而编写的函数:

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, ...)
}
tp5buhyn

tp5buhyn2#

我修改了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)
}

令人惊讶的是,R内置的加权平均值na.rm =T不处理NA权重。只是浪费了几个小时才发现这一点。
编辑:这里也是一个数据表的方式,如果有人想计算分组加权平均值:

# 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
jmo0nnb3

jmo0nnb33#

我对weighted.mean中的权重w做了一个简单的修改,修改量为coalesce,如下所示:

a = c(1,2,NA,4)
b = c(10,NA,30,40)
weighted.mean(a, dplyr::coalesce(b,0), na.rm = T)

我把缺少的权重替换成零,这样就修正了错误,返回结果为3. 4,:))。

相关问题