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,我知道这可以解决问题,但需要在公式本身中进行调整。
我调整了 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)
这是我最终为解决此问题而编写的功能:
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)
归档时间: |
|
查看次数: |
1577 次 |
最近记录: |