If statement 产生错误结果的SAS嵌套If语句

If statement 产生错误结果的SAS嵌套If语句,if-statement,sas,If Statement,Sas,ID no.6在返回“超重”时返回“体重不足”。 有问题的代码行(第30-53行)包含嵌套的if语句,并生成一个不希望的结果。这些行的目的是将样本划分为体重等级分类:体重不足、平均或超重 TITLE 'A SHORT SAS PROGRAM'; OPTIONS LS=72; * Create data file with height and weight data; DATA HTWT; INPUT ID GENDER $ HEIGHT WEIGHT; DATALINES;

ID no.6在返回“超重”时返回“体重不足”。 有问题的代码行(第30-53行)包含嵌套的if语句,并生成一个不希望的结果。这些行的目的是将样本划分为体重等级分类:体重不足、平均或超重

TITLE 'A SHORT SAS PROGRAM';
OPTIONS LS=72;
* Create data file with height and weight data;

DATA HTWT;
    INPUT ID GENDER $ HEIGHT WEIGHT;
    DATALINES;
1 M 68.5 155.0
2 F 61.2 99.00
3 F 63.0 115.0
4 M 70.0 205.0
5 M 68.6 170.0
6 F 65.1 125.0
7 M 72.4 220.0
;
    * Create a new categorical variable for height;

DATA HTWT;
    SET work.HTWT;

    IF HEIGHT < 68 THEN
        STATURE='Short';

    IF HEIGHT >=68 THEN
        STATURE='Tall';
RUN;

* Create a new categorical variable for weight;

DATA HTWT;
    SET work.HTWT;

    IF GENDER='M' THEN
        IF WEIGHT > 170 THEN
            WEIGHT_CLASS='Overweight';

        IF 170 >=WEIGHT >=150 THEN
            WEIGHT_CLASS='Average';

        IF WEIGHT < 140 THEN
            WEIGHT_CLASS='Underweight';

        ELSE IF GENDER='F' THEN
            IF WEIGHT > 120 THEN
                WEIGHT_CLASS='Overweight';

            IF 120 >=WEIGHT >=100 THEN
                WEIGHT_CLASS='Average';

            IF WEIGHT < 100 THEN
                WEIGHT_CLASS='Underweight';
        RUN;

        * Changing units of height from inches to centimeters;

        DATA HTWT;
            SET work.HTWT;
            HEIGHT=2.54 * HEIGHT;
        RUN;

        * Creates HEALTH_INDEX;

        DATA HTWT;
            SET work.HTWT;
            HEALTH_INDEX=WEIGHT/HEIGHT;
        RUN;

        * Print the data file HTWT;

        PROC PRINT DATA=HTWT;
            TITLE 'HEIGHT AND WEIGHT DATA';
        RUN;

        * Sorts the data by gender. Some procedures require sorted data;

        PROC SORT DATA=HTWT OUT=sorted;
            BY GENDER;
        RUN;

        * Print the sorted data file;

        PROC PRINT DATA=sorted;
            TITLE 'GENDER SORTED HTWT DATA';
        RUN;   
标题“短SAS程序”;
选项LS=72;
*创建包含身高和体重数据的数据文件;
数据HTWT;
输入ID性别$HEIGHT-WEIGHT;
数据线;
1米68.5 155.0
2 F 61.2 99.00
3 F 63.0 115.0
4米70.0 205.0
5米68.6170.0
6 F 65.1 125.0
7米72.4 220.0
;
*为高度创建一个新的分类变量;
数据HTWT;
SET work.HTWT;
如果高度<68,则
身材‘矮’;
如果高度>=68,则
身材高;
跑
*为权重创建一个新的分类变量;
数据HTWT;
SET work.HTWT;
如果性别=M,那么
如果重量>170,则
重量(超重);
如果170>=重量>=150,则
重量=平均值;
如果重量<140,则
重量=‘重量不足’;
否则,如果性别=F,则
如果重量>120,则
重量(超重);
如果120>=重量>=100,则
重量=平均值;
如果重量<100,则
重量=‘重量不足’;
跑
*将高度单位从英寸更改为厘米;
数据HTWT;
SET work.HTWT;
高度=2.54*高度;
跑
*创建健康指数;
数据HTWT;
SET work.HTWT;
健康指数=体重/身高;
跑
*打印数据文件HTWT;
过程打印数据=HTWT;
标题“身高和体重数据”;
跑
*按性别对数据进行排序。有些程序需要分类数据;
PROC SORT DATA=HTWT OUT=sorted;
按性别分列;
跑
*打印排序后的数据文件;
PROC打印数据=已排序;
标题“按性别分类的HTWT数据”;
跑

将嵌套的if语句修改为:

 IF  GENDER='M' THEN do;
     IF WEIGHT > 170 THEN
        WEIGHT_CLASS='Overweight';

    else if 150 <= Weight <= 170 THEN
        WEIGHT_CLASS='Average';

    else
        WEIGHT_CLASS='Underweight';
    end;

 else do;
    IF WEIGHT > 120 THEN
        WEIGHT_CLASS='Overweight';

    else iF 100 <= Weight =< 120 THEN
        WEIGHT_CLASS='Average';

    else
        WEIGHT_CLASS='Underweight';
 end;
如果GENDER='M',则执行;
如果重量>170,则
重量(超重);

else if 150连续if语句按顺序处理。因此,由于最后一个是测试体重是否小于100,那么第6个当然被列为体重不足。 如果要控制执行顺序,请添加一些其他和/或DO/END块。您的基本结构可能如下所示

if A then do;
  if B then xxx ;
  else if C then xxx ;
  else if D then xxxx ;
end;

请不要认为我的答案是正确的,因为我迟到了,而previos的答案很清楚,很有用。 但我在这里给你一个简单的建议,当你必须连接很多嵌套的if语句时,请使用selectwhen语句(来自sql语言)为所有可能变量的值提供一个层次

data want;
set have;
if gender='M' then do;
select (weight);
   when (>x) weight_class='';
   when (<y) weight_class='';
   otherwise weight_class=''
end;
end;
else if gender='F' then do;
select (weight);
   when (>x) weight_class='';
   when (<y) weight_class='';
   otherwise weight_class=''
end;
end;
run;
需要数据;
集有;
如果gender='M',那么就这样做;
选择(重量);
当(>x)重量等级='';
当(x)重量等级=“”;

when(If语句很有用,但有时创建一种格式并使用put语句来完成赋值更安全。如果你需要做很多If语句,这一点尤其正确,因为至少在我的情况下,键入的次数越多,我出错的机会就越大


带有put语句的代码更易于检查和维护。

这很可能会生成一个“do语句没有匹配的end语句”,您省略了第一个
end
语句。否则,逻辑是正确的。如果性别='F'
错误,我也会保留
else,这至少会给出缺少的值nder值出现。好了,伙计们,好消息,我们已经开始工作了!如果SENDER='M'那么添加;如果SENDER='F'那么添加;如果SENDER='M'那么添加;如果SENDER='F'那么添加;如果SENDER='F'那么添加;结束;位。还有一个ELSE IF位,用于所有下面的权重x数字比较。我有点困惑ELSE IF命令如何自由重叠,但它是wo我建议您在内部嵌套的if子句中实现
else if
,即当将权重绑定到categorySorry时,我的描述不清楚:在我放入代码的数据表中,第6行详细说明了数据表中的第6个人,此人的权重值为125,因此应该是'ov'erweight.我会试试DO积木的.谢谢。