R语言weights包wpct()输出保留零计数层级的解决方法咨询
解决方案
wpct函数默认会自动丢弃无观测值的层级,即便是传入指定levels的因子也不会保留零计数项,可通过以下两种方法实现全层级保留:
方法1:手动补全缺失层级
直接基于你需要的全量层级构造结果向量,将wpct计算得到的占比填充到对应位置,缺失层级自动补0:
library(weights) test <- c(1,1,1,1,1,1,2,2,2,3,3,3,5,5) weight <- c(.5,.5,.5,.5,.5,1,1,1,1,2,2,2,2,2) # 指定需要保留的全部层级 all_levels <- 0:5 # 计算原始占比 pct_raw <- wpct(test, weight) # 构造全层级结果,初始值为0 full_pct <- setNames(rep(0, length(all_levels)), all_levels) # 填充已有层级的占比 full_pct[names(pct_raw)] <- pct_raw
执行后full_pct的输出结果如下,所有指定层级均被保留,无观测值的层级占比为0:
0 1 2 3 4 5 0.0000000 0.2121212 0.1818182 0.3636364 0.0000000 0.2424242
方法2:使用tidyverse生态实现带权重占比计算
借助dplyr的count函数的.drop = FALSE参数保留所有因子层级,再自行计算占比,逻辑更灵活:
library(dplyr) library(tidyr) data.frame(x = factor(test, levels = 0:5), w = weight) %>% # 按x分组求和权重,.drop=FALSE保留所有因子层级 count(x, wt = w, .drop = FALSE) %>% # 计算各层级占比 mutate(pct = n / sum(n)) %>% # 提取为命名向量,和wpct输出格式一致 pull(pct, name = x)
内容的提问来源于stack exchange,提问作者TiF
相关产品推荐
相关产品推荐

