如何从人口稀少的数据框中获取加权分位数?

How can I get weighted quantiles from a sparsely populated data frame?

我正在寻求一些帮助,以将一些列添加到我似乎无法正确处理的数据框中。我的 df 大约有 40,000 行 x 30 列,结构如下:

Key       0  1  2  3  4  5  6  7  8  9 10  11 12 13 14  15 16  17  18  19 20  21 22 23 24 25  NumNotNA
317862 2151 NA NA NA NA NA NA NA NA NA NA  NA NA NA NA  NA NA  NA  NA  NA NA  NA NA NA NA NA         0
317881 1105 51 33 98  8 27 56 28 17 39 11 112 14 87  7 273 56 189 245 119  7 147 25 NA NA NA        22
290507  111 56 28 NA NA NA NA NA NA NA NA  NA NA NA NA  NA NA  NA  NA  NA NA  NA NA NA NA NA         2
290509  196 NA NA NA NA NA NA NA NA NA NA  NA NA NA NA  NA NA  NA  NA  NA NA  NA NA NA NA NA         0
290520   91  0  2  1  4  1  1  0  0  0  1   1  4  0  1   0  5   0   1   0  1   0  0  4  1  0        25
290521   92  2  5 22  3  4  1 19  0  5  0   1 13  0  0   0  1   0   0   1  1   0 46 15  0  1        25

我希望向数据框中添加 11 个新列,一个用于序列 seq(0,1,0.1) 中的每个加权分位数。我正在使用以下余弦权重对上面 df 中的列名称 1:25 的观察值进行加权。

cosine_weights <- 1 + cos(pi*seq(0,24)/24)

我可以通过在一行中使用来自 Hmisc 和 reldist 包的 wtd.quantile() 函数来获取我正在寻找的值,但我似乎无法弄清楚如何使用以有用的方式正确应用函数以将其应用于整个数据框。请注意,其中一个问题是有几行(如上面的第 1 和第 4 行)包含列名 1:25 的所有 NA 值。对于这些行,我希望我的分位数也产生 NA 值,但为其他行产生有效的分位数。

这是我从每一行中寻找的输出示例,尽管我想将其作为新列附加到我现有的数据框中。我尝试将其与 mapply 一起使用,但将 运行 保留为问题。我必须将数据强制转换为数字才能进行计算,但是当我尝试将其应用于完整的 df 时,它说我的(列表)对象不能被强制键入 'double'。我尝试的每个修复似乎都失败了,而且我无法通过搜索找到任何其他类似的示例。

> Hmisc::wtd.quantile(as.numeric(dat[6, 3:27]), weights=cosine_weights, probs = seq(0,1,0.1))
  0%  10%  20%  30%  40%  50%  60%  70%  80%  90% 100% 
 0.0  0.0  0.0  1.0  1.6  3.0  4.0  5.0  6.6 20.8 46.0

感谢您的帮助!

我们可以写一个函数来计算我们想要的值

calculate_quantile <- function(x) {
   if (all(is.na(x))) return(rep(NA, 11))
   as.numeric(Hmisc::wtd.quantile(x, weights=cosine_weights, probs = seq(0,1,0.1)))
}

并使用 apply

按行应用它
dat[paste0('Q', 1:11)] <- t(apply(dat[3:27], 1, calculate_quantile))