我试图理解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已经存在的变量有关的问题吗?
贝斯茨
答案 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=.