我正在尝试根据名称查找数据集的累积总和。我有两种方法,但差别很小。
数据集如下所示
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(根据加法则给出相同的结果)
请解释这里发生的事情。
答案 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 + score
和score + cum_score
在数学上是相同的,但在SAS中则不一样。
SUM语句具有隐式保留,但重要的是变量在语句中的顺序。这是因为已经存在的变量不会被保留,至少不会保留你的预期,如果cum_score在语句中是第一个,它将被保留。