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 如何将最后一次观察的值保留在较短的组中。
我试图了解保留语句应该如何与现有变量一起使用,但似乎我仍然遗漏了一些东西,因为我没有得到想要的结果
在下面的示例中,我的代码旨在为值变量创建一种计数器
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 如何将最后一次观察的值保留在较短的组中。