SAS中获取变量频次:男性热量摄入分组人数及占比统计问题咨询
核心错误原因
你的代码存在两个直接导致结果异常的问题:
- 条件判断语法错误:第二组的判断语句不符合SAS语法规则,
else sex=1 and TOTAL<=1800 then TOTALcat=2;写法无效,else后接条件必须加if关键字,应为else if 条件 then。 - 缺失值未纳入统计:不符合两个分组规则的人群(女性、总热量在1801~2999大卡的男性)的
TOTALcat未赋值会变成缺失值,proc freq默认不统计缺失值,也不会将其计入占比计算的总基数。
修正执行步骤
步骤1:修正分组赋值逻辑
替换原分组的data步代码,先初始化变量避免历史脏值影响,同时明确判断逻辑:
data nutrition; set nutrition; TOTALcat = .; /* 初始化清空变量原有值 */ if sex=1 then do; if TOTAL >= 3000 then TOTALcat=1; else if TOTAL <= 1800 then TOTALcat=2; end; run;
步骤2:补充变量格式(可选,提升结果可读性)
给TOTALcat新增对应格式,输出结果可直接显示分组含义:
proc format; value sex 1 = '男' 2 = '女'; value TOTALcat 1 = '男性总热量≥3000大卡' 2 = '男性总热量≤1800大卡'; run; /* 把格式关联到对应变量 */ data nutrition; set nutrition; format sex sex. TOTALcat TOTALcat.; run;
步骤3:调整频率统计语句
根据你的统计需求选择对应方案:
- 方案A:统计全量数据集中两个分组的人数及占全量样本的比例
proc freq data=nutrition; table TOTALcat / missing; /* missing参数将缺失值纳入总基数计算占比 */ run;
- 方案B:仅统计男性人群内部两个分组的人数及占男性总样本的比例
proc freq data=nutrition; where sex=1; /* 仅筛选男性样本统计 */ table TOTALcat; run;
可选优化:合并冗余代码
你之前多次重复覆盖nutrition数据集容易出错,可以把热量计算、分组、格式关联的步骤合并:
data nutrition; set 'C:\Users\14015\Pictures\BST #1\nutrition'; format sex sex. TOTALcat TOTALcat.; /* 计算三类营养的热量 */ CARBS = CARBS*4; FAT = FAT*9; PROTEIN = PROTEIN*4; TOTAL = sum(of CARBS FAT PROTEIN); /* 分组赋值 */ TOTALcat = .; if sex=1 then do; if TOTAL >= 3000 then TOTALcat=1; else if TOTAL <= 1800 then TOTALcat=2; end; run;
原来定义的libname lab未被后续代码调用,属于冗余代码可以直接删除。
内容的提问来源于stack exchange,提问作者J.S. 2017
相关产品推荐
相关产品推荐

