Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SAS retain语句和现有变量_Sas_Retain - Fatal编程技术网

SAS retain语句和现有变量

SAS retain语句和现有变量,sas,retain,Sas,Retain,我试图理解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变量是va

我试图理解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值

我很想了解为什么“+”符号中的implict retain语句在这种情况下不起作用

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


Bests

RETAIN语句所做的就是防止变量在数据步骤的顶部被设置为缺失。在代码中,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语句上读取,所以保留Count。Count2被保留,因为sum语句具有隐式retain。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如何保留较短组中最后一次观察的值。

谢谢昆汀。我原以为可以使用一个设置为0的现有变量,并结合retain使其成为聚合器。总有新东西要学。胜过