2017-09-12 101 views
2

我想了解应该与现有的变量上班保留声明,但仍似乎我失去了一些东西,因为我没有得到期望的结果SAS保留声明,现有的变量

在下面的例子我的代码目的是创造一种计数器的可变

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值。

我想了解为什么在这个例子中,“+”符号中的implict retain语句不起作用。

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

最好成绩

回答

1

所有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; 

在循环的顶部,计数和共2个记录被保留。由于显式保留语句,并且因为它是在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

谢谢昆汀。我期待着这样,相反,它可以使用一个现有的变量,设置为0,并结合retain,使其成为一个聚合器。总是有新东西要学。贝斯茨 –

2

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

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