在SAS中创建年龄组变量

时间:2018-11-20 14:37:19

标签: sas

我需要帮助来创建这个年龄组变量。在我的数据年龄中,小数点后9位。我可以决定刚选择四分位数的类别。但是我不断收到这些错误...

“错误388-185:需要算术运算符。 错误200-322:该符号无法识别,将被忽略。”

我尝试四舍五入并将le更改为<=,但仍然会给出相同的错误...:(

data sta310.hw4;
   set sta310.gbcshort;
   age_cat=.;
   if age le 41.950498302 then age_cat = 1;
   if age > 41.950498302 and le 49.764538386 then age_cat=2;
   if age > 49.764538386 and le 56.696966378 then age_cat=3;
   if age > 56.696966378 then age_cat=4;
run;

4 个答案:

答案 0 :(得分:0)

这件事最好使用proc格式。在您和人工运算符之后,您缺少变量名。您也不需要age_cat =。在一开始的时候。请在您的人工操作员之后添加您的年龄变量,如下所示

 data sta310.hw4;
 set sta310.gbcshort;
 age_cat=.;
  if age le 41.950498302 then age_cat = 1;
  if age > 41.950498302 and age le 49.764538386 then age_cat=2;
  if age > 49.764538386 and age le 56.696966378 then age_cat=3;
   if age > 56.696966378 then age_cat=4;
 run;

答案 1 :(得分:0)

and leand <=语法不正确。这样的语法可能可能是COBOL所不具备的。

尝试这种SAS Expression形式

  • < 变量 <=

示例

data sta310.hw4;
   set sta310.gbcshort;
   age_cat=.;
   if age <= 41.950498302 then age_cat = 1;
   if 41.950498302 < age <= 49.764538386 then age_cat=2;
   if 49.764538386 < age <= 56.696966378 then age_cat=3;
   if 56.696966378 < age then age_cat=4;
run;    

可以使用select语句来完成类似且更安全的筛子逻辑。

  select;
    when (age <= 41.950498302) age_cat=1;
    when (age <= 49.764538386) age_cat=2;
    when (age <= 56.696966378) age_cat=3;
    otherwise age_cat=4; 
  end;

SAS select C switch语句的不同之处在于,肯定的when语句流过select(并且不需要break中经常看到的switch/case

答案 2 :(得分:0)

问题出在具有多个条件的if语句中。另外,由于age_cat不是数字变量(即,您不希望对该变量求和),我将其设置为长度为1的字符变量,并在格式声明中预先指定(SAS数据管理中的最佳做法) 。 最后,我还建议重新构造您的if else构造,以提高内存效率:

data sta310.hw4;
   set sta310.gbcshort;
   format age_cat $1.; 
   if age <= 41.950498302 then age_cat = "1";
   else if 41.950498302 < age <= 49.764538386 then age_cat= "2";
   else if 49.764538386 < age <= 56.696966378 then age_cat="3";
   else age_cat="4";
run;

希望这会有所帮助,

答案 3 :(得分:0)

如果要与四分位数分组,请避免进行硬编码,并使用GROUPS = 4的PROC RANK。小组将是0到3,但想法相同。

   proc rank data=sta310.gbcshort out=sta310.hw4 groups=4;
   var age;
   rank age_cat;
   run;

在您当前的程序中,此行/逻辑是您的问题:

if age > 41.950498302 and le 49.764538386 then age_cat=2;

应为:

 if 41.950498302 < age <= 49.764538386 then age_cat=2;

您还应该将其切换为IF / ELSE IF而不是IF语句。您应该执行此操作,因为一旦找到类别,它就会停止评估条件,因此不会检查每个IF条件,这会使它稍快一些。这不是您在家庭作业中会注意到的东西,但是如果您要处理更大的数据集,那么了解这一点非常重要。

if age <= 41.950498302 then age_cat = 1;
else if 41.950498302 < age <= 49.764538386 then age_cat=2;
else if 49.764538386 < age <= 56.696966378 then age_cat=3;
else if 56.696966378 < age then age_cat=4;