r语言 - 如何从稀疏填充的数据框中获取加权分位数?



我正在寻找一些帮助,以向数据框添加一些我似乎无法正确处理的列。我的 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)

我能够通过使用 wtd.quantile(( 功能从单行上的 Hmisc 和 reldist 包中获取我正在寻找的值,但我似乎无法弄清楚如何正确使用应用函数以有用的方式将其应用于整个数据框。请注意,其中一个问题是几行(如上面的第 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))

最新更新