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,我知道这样做会很有效,但要在公式本身中寻找调整。
NA
na.rm
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, ...) }
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
jmo0nnb33#
我对weighted.mean中的权重w做了一个简单的修改,修改量为coalesce,如下所示:
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,:))。
3条答案
按热度按时间oymdgrw71#
下面是我为解决这个问题而编写的函数:
tp5buhyn2#
我修改了Mhairi的代码,使其不使用data.frame和na.omit:
令人惊讶的是,R内置的加权平均值na.rm =T不处理NA权重。只是浪费了几个小时才发现这一点。
编辑:这里也是一个数据表的方式,如果有人想计算分组加权平均值:
jmo0nnb33#
我对
weighted.mean
中的权重w
做了一个简单的修改,修改量为coalesce
,如下所示:我把缺少的权重替换成零,这样就修正了错误,返回结果为3. 4,:))。