如何在R中用summarytools按分组计算带权重的频数与描述统计
解决summarytools分组计算加权统计的长度不匹配问题
报错原因
你遇到的weights vector must have same length as 'x'错误,核心原因是分组后传入的权重向量长度和当前分组的子数据框行数不匹配:
- 使用
group_by(gender)后,dplyr会将原始数据拆分为多个子数据框(每个gender对应一组),每个子数据框的行数远小于原始的2000行; - 但你传入的
weights = mydf$weight是原始完整数据的权重向量(长度2000),和子数据框的行数不匹配,因此触发报错。
两种解决方法
方法1:使用summarytools自带的by参数(推荐)
summarytools的descr和freq函数本身支持by参数直接指定分组变量,无需依赖dplyr::group_by,会自动对应每个分组的权重子集,代码更简洁:
分组计算加权描述统计
library(summarytools) mydf_descr_gender <- descr(mydf, by = "gender", weights = mydf$weight)
分组计算加权频数表
mydf_freq_gender <- freq(mydf, by = "gender", weights = mydf$weight)
方法2:结合dplyr的do函数(tidyverse风格)
如果一定要用dplyr的分组逻辑,需要在do函数中调用descr/freq时,使用当前分组子数据框的权重(而非原始数据的权重),用.$weight指代当前分组的权重向量:
分组计算加权描述统计
library(dplyr) library(summarytools) mydf_descr_gender <- mydf %>% group_by(gender) %>% do(descr(., weights = .$weight)) %>% ungroup()
分组计算加权频数表
mydf_freq_gender <- mydf %>% group_by(gender) %>% do(freq(., weights = .$weight)) %>% ungroup()
额外说明
- 用
by参数生成的结果格式更紧凑,会把不同分组的统计结果整合在同一张表格中,方便对比; - 用
do函数生成的结果是按分组行绑定的,可通过view(mydf_descr_gender)或print(mydf_descr_gender, method = "pander")调整展示格式。
内容的提问来源于stack exchange,提问作者Caragh
相关产品推荐
相关产品推荐

