【问题标题】:Creating an agegroup variable in SAS在 SAS 中创建年龄组变量
【发布时间】:2019-04-23 00:54:26
【问题描述】:

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

“错误 388-185:需要算术运算符。 ERROR 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;

【问题讨论】:

    标签: sas


    【解决方案1】:

    这东西最好用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;
    

    【讨论】:

      【解决方案2】:

      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 selectC switch 语句的不同之处在于,肯定的when 语句流过select(并且不需要break,因为这是经常看到的)在switch/case)

      【讨论】:

        【解决方案3】:

        问题在于您的 if 语句具有多个条件。另外,因为 age_cat 不是数字变量(即你不想总结这个变量),我会把它作为长度为 1 的字符 var,预先在格式语句中指定它(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;
        

        希望这会有所帮助,

        【讨论】:

        • 为什么要附加$1. 格式的新变量? SAS 已经知道如何打印字符变量。要在其他语句中使用变量之前定义变量的类型和长度,请使用LENGTHATTRIB 语句,如FORMAT 或赋值语句。
        • 是的,目的是锁定长度,从 PDV 构造的角度来看,FORMAT 语句比 LENGTH 语句更节省内存
        • 谁的记忆?一旦您进行了分析,使用了错误数量的组,因为某种格式附加到字符变量的格式太短,您会很长时间记得附加 $xx 格式是一件危险的事情。
        • 我是指构建程序数据向量或简称PDV时的总内存使用量。当然也可以使用 LENGTH 语句,关于你描述的可能发生的情况,但这与手头的问题无关,所以我不明白你为什么要喊出来,所有的问题都是关于一个简单的类变量,我我建议将其设为字符变量,因为它只占用 1 个字节,而普通数字 var 会占用标准的 8 个字节。 LENGTH 和 FORMAT 语句都是此特定问题/问题的正确选择
        • 我的一个小烦恼,因为它会给新手 SAS 程序员带来危险和困惑,他们看到这种用法并认为格式语句实际上是定义变量长度的一种方式。相反,长度被设置为变量首次出现在格式语句中的副作用。
        【解决方案4】:

        如果您使用四分位数进行分组,请避免使用硬编码并使用 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;
        

        【讨论】:

        • 添加ELSE 后,您可以简化条件。 else if age &lt;= 49.764538386
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-29
        • 1970-01-01
        • 2017-03-07
        • 1970-01-01
        相关资源
        最近更新 更多