我正在寻找类似于weighted.mean()的形式.很抱歉发布了这样一个平庸的问题......对R来说很新.我通过搜索找到了一些解决方案,写出了整个功能,但会感谢一些用户友好的东西.
wkm*_*or1 41
以下包都有计算加权中位数的函数:'aroma.light','isotone','limma','cwhmisc','ergm','laeken','matrixStats,'PSCBS'和'bigvis' (在github上).
为了找到它们,我在'sos'包中使用了无价的findFn(),它是R内置帮助的扩展.
findFn('weighted median')
Run Code Online (Sandbox Code Playgroud)
要么,
???'weighted median'
如??? 就是以同样的方式快捷方式?some.function是help(some.function)
Jai*_*nge 23
x使用(整数)权重的相同长度向量计算向量的加权中值w:
median(rep(x, times=w))
Run Code Online (Sandbox Code Playgroud)
ika*_*sky 21
一些经验使用@ wkmor1和@Jaitropmange的答案.
我从3包检查3个功能,isotone,laeken,和matrixStats.只能matrixStats正常工作.其他两个(就像median(rep(x, times=w)解决方案一样)给出整数输出.只要我计算了人口的年龄中位数,小数就很重要.
df <- data.frame(age = 0:100,
pop = spline(c(4,7,9,8,7,6,4,3,2,1),n = 101)$y)
library(isotone)
library(laeken)
library(matrixStats)
isotone::weighted.median(df$age,df$pop)
# [1] 36
laeken::weightedMedian(df$age,df$pop)
# [1] 36
matrixStats::weightedMedian(df$age,df$pop)
# [1] 36.164
median(rep(df$age, times=df$pop))
# [1] 35
Run Code Online (Sandbox Code Playgroud)
matrixStats::weightedMedian() 是可靠的解决方案
这只是一个简单的解决方案,几乎可以在任何地方使用。
weighted.median <- function(x, w) {
w <- w[order(x)]
x <- x[order(x)]
prob <- cumsum(w)/sum(w)
ps <- which(abs(prob - .5) == min(abs(prob - .5)))
return(x[ps])
}
Run Code Online (Sandbox Code Playgroud)
真的很老的帖子,但我刚刚遇到它并对不同的方法进行了一些测试。spatstat::weighted.median()似乎比median(rep(x, times=w))它快 14 倍,如果您想多次运行该函数,它实际上很明显。测试是在一个相对较大的调查中进行的,大约有 15,000 人。