SAS 保留语句和现有变量

SAS retain statement and existing variables

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

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

 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;

并且我期望计数变量将是值列的累积结果。但是,结果未实现,该列保留其原始 0 值。

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

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

最佳

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 语句,并且因为它是在 SET set 语句上读取的,因此保留了 Count。 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=.

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

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