Есть ли какая-то конкретная причина, по которой этот код не будет работать?

#sas #format

#sas #формат

Вопрос:

Таким образом, этот код продолжает возвращать ошибки вокруг символов моих операторов if, когда я их удаляю, он выполняется до завершения, но отказывается печатать / распознавать мой код формата. Новичок в этом деле, собираюсь выбросить свой компьютер из окна, так что было бы здорово, если бы более наметанный глаз мог взглянуть.

 Proc Format;
   Value $Gender '1'='Male'
                 '2'='Female';
                   
   Value $STATUS    '1'='Yes'
                    '0'='No';
   
run;                                       


data Myocard;
    Infile '/folders/myfolders/sasuser.v94/Data for Classes 3 to 6/MI.dat';
    Input ID      $1-3
          Gender    $4
          BMI      5-8
          Age      9-10
           DM       $11
          HTN       $12
           MI       $13
       PACKYR     14-15;    
       
Format Gender $SexFMT. HTN DM MI $STATUS.;   
   
If BMI 18.0-25.0 ='Normal';
If BMI 25.1-30.0 ='Overweight';
If BMI > 30.0 ='Obese';
           
If PACKYR  0 code 0;
If PACKYR > 0 code 1;       
run;       

proc print data= myocard label;
     Label  ID ='Subject Identifier'
           BMI ='Body Mass Index'
            DM ='Diabetes Mellitus Status'
           HTN ='Hypertension'
            MI ='Myocardial Infarction'
        PACKYR ='Packs Smoked Per Day Per Year';
Format Gender $SexFMT. HTN DM MI $STATUS.;           
run;          
 

Ответ №1:

Я не могу придумать ни одного языка, на котором работали бы закодированные вами утверждения.

 If BMI 18.0-25.0 ='Normal';
If BMI 25.1-30.0 ='Overweight';
If BMI > 30.0 ='Obese';
           
If PACKYR  0 code 0;
If PACKYR > 0 code 1;
 

Похоже, вы сопоставляете значения в диапазоне с категориальным значением.

Вы можете использовать Proc FORMAT для определения пользовательских форматов, которые используются в вашем Proc PRINT

 Proc FORMAT;
  value BMI
     18 - 25 = 'Normal'
     25 - 30 = 'Overweight'
     30 - high = 'Obese'
  ;

  value packyr_code
     0 = '0'
     0-high = '1'
  ;
 

Если вместо этого вам нужна новая переменная, рассмотрите SELECT оператор и IF/THEN/ELSE операторы.

    data myocard;
     ...
     select;
       when (18 <  bmi < 25) obesity_class = 'Normal';
       when (25 <= bmi < 30) obesity_class = 'Overweight'
       when (30 < bmi)       obesity_class = 'Obese'
       otherwise             obesity_class = cats('bmi:',bmi);
     end;

          if packyr = 0 then code = 0; 
     else if packyr > 0 then code = 1; 
     else code = -1;
   run;
 

Ответ №2:

Ваши операторы IF неверны с точки зрения синтаксиса.

  • Новое значение не присваивается новой переменной
  • Несколько операторов IF вместо IF/ELSE
  • ЗНАЧИТ, пропал без ВЕСТИ
  • Пропавший без вести =

Этот код:

 If BMI 18.0-25.0 ='Normal';
If BMI 25.1-30.0 ='Overweight';
If BMI > 30.0 ='Obese';
       
 

Должно быть:

 If  18.0<BMI<=25 then BMI_Category ='Normal';
else If 25.1<=BMI<=30.0 then BMI_Category ='Overweight';
else If BMI > 30.0 then BMI_Category='Obese';
           
If PACKYR = 0 then code_category = 0;
else PACKYR > 0 then code_category = 1; 
 

Или использование ваших форматов с помощью оператора PUT

 BMI_Category = put(BMI, BMI.);
Code_category = put(packyr, packyr_code.);