SAS保留声明和现有变量

时间:2017-09-12 16:21:11

标签: sas retain

我试图理解retain语句应该如何与现有变量一起使用,但是我似乎错过了一些东西,因为我没有得到理想的结果

在以下示例中,我的代码旨在为值变量

创建一种计数器
 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变量将是值列累积的结果。但是,结果未获得,并且列保持其原始的0值。

我有兴趣理解为什么“+”符号中的implict retain语句在这种情况下不起作用。

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

贝斯茨

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

所有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。由于显式的retain语句,因此保留了Count,因为它是在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=.