R语言prop.table添加筛选条件保留全样本占比计算方法
问题说明
基于mtcars数据集的初始统计目标为统计不同carb(化油器数量)取值下,4缸、6缸、8缸车辆的分组占比,初始实现代码如下:prop.table(with(mtcars, table(carb, cyl)), margin = 1)
上述代码按carb行维度计算各气缸数车辆占比,输出结果:
cyl carb 4 6 8 1 0.7142857 0.2857143 0.0000000 2 0.6000000 0.0000000 0.4000000 3 0.0000000 0.0000000 1.0000000 4 0.0000000 0.4000000 0.6000000 6 0.0000000 1.0000000 0.0000000 8 0.0000000 0.0000000 1.0000000
新增统计规则:仅统计gear == 4(前进挡数为4)的车辆,但占比计算分母必须为对应carb分组下的全部车辆总样本量,不能提前过滤非gear==4的样本,否则无法满足全样本对标要求。此前使用if语句实现时报错:the condition has length > 1 and only the first element will be used。
报错原因
R语言中if()仅接受长度为1的逻辑值作为判断条件,直接传入长度大于1的向量型逻辑列(例如写if(mtcars$gear ==4)做筛选)时,函数只会取向量第一个元素做判断,必然触发该报错,计算结果也完全不符合预期。
可行实现方案
核心思路是保留全样本的分组分母基准,仅将非gear==4的样本计数从分子中剔除,不改变原有的维度结构和分母取值,实现代码如下:
# 1. 生成全样本carb、cyl二维列联表,提取各carb分组的总样本量作为固定分母 full_tab <- with(mtcars, table(carb, cyl)) carb_denominator <- rowSums(full_tab) # 2. 生成三变量交叉表,提取gear=4的carb、cyl计数作为分子,自动对齐维度、缺失组合补0 gear4_tab <- with(mtcars, table(carb, cyl, gear))[, , as.character(4)] # 3. 分子除以全样本分母,得到符合要求的占比结果 result <- gear4_tab / carb_denominator
运行后输出结果:
cyl carb 4 6 8 1 0.5714286 0.2857143 0.0000000 2 0.4000000 0.0000000 0.0000000 3 0.0000000 0.0000000 0.0000000 4 0.0000000 0.4000000 0.0000000 6 0.0000000 0.0000000 0.0000000 8 0.0000000 0.0000000 0.0000000
该结果的每行占比分母和初始需求完全一致,为对应carb取值下的全量车辆总数,仅保留gear=4的车辆计数参与分子计算,满足全样本对标要求。
内容的提问来源于stack exchange,提问作者Sascha
相关产品推荐
相关产品推荐

