【问题标题】:SAS retain statement and existing variablesSAS 保留语句和现有变量
【发布时间】:2017-09-12 16:21:10
【问题描述】:

我正在尝试了解 retain 语句应该如何与现有变量一起使用,但我似乎仍然遗漏了一些东西,因为我没有得到想要的结果

在以下示例中,我的代码旨在为 value 变量创建一种计数器

 data new (sortedby=id);
 input id $ value count;
 datalines ;
 d 55 0
 d 66 0
 d 33 0
 run;

 data cc;
 set new;
 by id;
 retain count;
 count+value;
 run;

而且我期望 count 变量将是 value 列累积的结果。但是,结果未达到,列保持其原始 0 值。

我很想了解为什么“+”号中的隐含保留语句在这种情况下不起作用。

这是与count是一个已经存在的变量有关的问题吗?

最佳

【问题讨论】:

    标签: sas retain


    【解决方案1】:

    是的,变量已经在输入数据集上这一事实会影响您的程序。当 SET 语句执行时,保留的 COUNT 值被从输入数据集中读取的 COUNT 值覆盖。

    请注意,实际上来自输入数据集的所有变量都已通过 SAS 跨数据步迭代保留。这解释了 MERGE 语句如何能够实现一对多合并。它还解释了当您进行 N 到 M 合并时,SAS 将最后一次观察的值保留在较短组中的方式。

    【讨论】:

      【解决方案2】:

      RETAIN 语句所做的只是防止变量在 DATA 步的顶部被设置为缺失。在您的代码中,您的 SET 语句读取 COUNT (0) 的值,因此即使保留该值,当 SET 语句执行时它也会重置为 0。

      我会玩下面这样的代码,里面有很多 PUT 语句:

      data cc;
         put "Top of loop" (_n_ value count count2 count3)(=) ;
         set new;
         put "After set statement " (_n_ value count count2 count3)(=) ;
         by id;
         retain count;
         count+value;
         count2+value ;
         count3=sum(count3,value) ;
         put "After sum statement" (_n_ value count count2 count3)(=) ;
      run;
      

      在循环的顶部,保留了 Count 和 Count2。计数被保留是因为显式的保留语句,并且因为它是在 SET set 语句上读取的。保留 Count2 是因为 sum 语句具有隐式保留。不保留 Count3。

      结果如下:

      Top of loop         _N_=1 value=.  count=.  count2=0  count3=.
      After set statement _N_=1 value=55 count=0  count2=0  count3=.
      After sum statement _N_=1 value=55 count=55 count2=55 count3=55
      
      Top of loop         _N_=2 value=55 count=55 count2=55  count3=.
      After set statement _N_=2 value=66 count=0  count2=55  count3=.
      After sum statement _N_=2 value=66 count=66 count2=121 count3=66
      
      Top of loop         _N_=3 value=66 count=66 count2=121 count3=.
      After set statement _N_=3 value=33 count=0  count2=121 count3=.
      After sum statement _N_=3 value=33 count=33 count2=154 count3=33
      Top of loop         _N_=4 value=33 count=33 count2=154 count3=.
      

      【讨论】:

      • 谢谢昆汀。我期望相反,可以使用设置为 0 的现有变量,并结合保留使其成为聚合器。总有新东西要学。最佳
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-22
      • 2011-06-16
      • 1970-01-01
      • 1970-01-01
      • 2020-05-11
      • 1970-01-01
      相关资源
      最近更新 更多