在SAS中使用BY语句是否保留变量

时间:2018-01-12 15:06:08

标签: sas

我正在尝试根据名称查找数据集的累积总和。我有两种方法,但差别很小。

数据集如下所示

1 David 45
1大卫74
2 Sam 45
2拉姆54
3 Bane 87
3 Mary 92
3 Bane 87
4丹麦人23
5 Jenny 87
5肯87
6 Simran 63
8 Priya 72

PROC SORT DATA = READIN;
BY ID;
RUN;



DATA READIN1;
SET READIN;
BY ID;
if first.id then 
cum_score=score;
else cum_score+score;
run;


DATA READIN2;
SET READIN;
if first.id then
cum_score=score;
else score+cum_score;
run;

虽然第一种方法给出了正确的累积频率,但也建议在BY组处理中,新创建的变量是自动保留的,第二种方法给出不正确的结果,表明新变量不是通过组处理自动保留的。 有趣的是,这两种方法的唯一变化是cum_score +得分改为得分+ cum_score(根据加法则给出相同的结果)

请解释这里发生的事情。

2 个答案:

答案 0 :(得分:1)

这与BY处理无关。它是关于 sum语句的含义以及尝试保留由SET语句加载的变量的影响。

sum语句的格式为

variable + expression ;

它基本上等同于这两个陈述:

retain variable 0 ;
variable = sum(variable,expression);

当您保留变量时,SAS将不会在下一个数据集迭代开始时将其重置为缺失。因此,它在迭代N结束时的值被“保留”到迭代N + 1的开始。但是,如果该变量包含在数据集中,则当从数据集读取的值覆盖时,保留值将丢失。

另请注意,输入数据集中定义的所有变量都会自动保留,但由于通常在SET(或MERGE,UPDATE等)语句运行时会覆盖它们,因此您不会注意到它。

答案 1 :(得分:0)

cum_score + scorescore + cum_score在数学上是相同的,但在SAS中则不一样。

SUM语句具有隐式保留,但重要的是变量在语句中的顺序。这是因为已经存在的变量不会被保留,至少不会保留你的预期,如果cum_score在语句中是第一个,它将被保留。