You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SAS中获取变量频次:男性热量摄入分组人数及占比统计问题咨询

核心错误原因

你的代码存在两个直接导致结果异常的问题:

  1. 条件判断语法错误:第二组的判断语句不符合SAS语法规则,else sex=1 and TOTAL<=1800 then TOTALcat=2; 写法无效,else后接条件必须加if关键字,应为else if 条件 then。
  2. 缺失值未纳入统计:不符合两个分组规则的人群(女性、总热量在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 21:27:04