SAS滞后函数问题(不在条件子句中)

SAS滞后函数问题(不在条件子句中),sas,Sas,带有LAG和if函数的代码没有按我预期的方式工作。我知道如何纠正它。然而,我正在寻求帮助,以了解为什么会发生这种情况。我知道lag会有条件语句的问题,但是我的lag函数不在if语句中 我的第二身份证记录有问题。对于id#2,记录#2,优先级应为0而不是2。我不明白为什么 data a; input vid 1. rid 2. flag 3. ; datalines; 1 1 0 1 2 1 1 3 1 1 4 0 2 1 0 2 2 0 2 3 0 2 4 2 ; run; /*in

带有LAG和if函数的代码没有按我预期的方式工作。我知道如何纠正它。然而,我正在寻求帮助,以了解为什么会发生这种情况。我知道lag会有条件语句的问题,但是我的lag函数不在if语句中

我的第二身份证记录有问题。对于id#2,记录#2,优先级应为0而不是2。我不明白为什么

    data a;
input  vid 1. rid 2. flag 3. ;
datalines;
1 1 0
1 2 1
1 3 1
1 4 0
2 1 0
2 2 0
2 3 0
2 4 2
;
run;

/*incorrect version*/
data b;
set a;
by vid;
 Cumflag+flag;
   /*Keep track of prior record running total*/
   put (vid rid flag CumFlag)(=) ;
   Priorflag=lag(Cumflag);
   put (vid rid flag CumFlag PriorFlag)(=) ;
    if first.vid then do;
   Cumflag=flag;
   Priorflag=0;
     put (vid rid CumFlag PriorFlag)(=) ;
end;
run;

/*correct version*/
data c;
set a;
by vid;
 Cumflag+flag;
   /*Keep track of prior record running total*/
    if first.vid then   Cumflag=flag;

      Priorflag=lag(Cumflag);
      if first.vid then    Priorflag=0;
run;
输出数据集B如下所示。 vid=2有问题,prio=2

LAG()函数不会从上一次观察中检索值。它只是从您之前传入的值列表中检索值。滞后的值是LAG()函数运行时变量的值。这就是为什么您通常不希望有条件地执行LAG()函数

在BY组第一次观察时重置CUMFLAG之前,第一个程序滞后于CUMFLAG的值。第二个程序在重置后滞后于CUMFLAG的值。

LAG()函数不会从以前的观察中检索值。它只是从您之前传入的值列表中检索值。滞后的值是LAG()函数运行时变量的值。这就是为什么您通常不希望有条件地执行LAG()函数


在BY组第一次观察时重置CUMFLAG之前,第一个程序滞后于CUMFLAG的值。第二个程序在重置后滞后于CUMFLAG的值。

同意Tom。建议添加PUT语句,以便查看值

data b;
set a;
by vid;
 Cumflag+flag;
   /*Keep track of prior record running total*/
   Priorflag=lag(Cumflag);
   put (vid flag CumFlag PriorFlag)(=) ;
    if first.vid then do;
   Cumflag=flag;
   Priorflag=0;
end;
run;
返回

vid=1 flag=0 Cumflag=0 Priorflag=.
vid=1 flag=1 Cumflag=1 Priorflag=0
vid=1 flag=1 Cumflag=2 Priorflag=1
vid=1 flag=0 Cumflag=2 Priorflag=2
vid=2 flag=0 Cumflag=2 Priorflag=2  ***
vid=2 flag=0 Cumflag=0 Priorflag=2  ***
vid=2 flag=0 Cumflag=0 Priorflag=0
vid=2 flag=2 Cumflag=2 Priorflag=0
vid=3 flag=0 Cumflag=2 Priorflag=2
vid=3 flag=0 Cumflag=0 Priorflag=2
vid=3 flag=1 Cumflag=1 Priorflag=0
vid=3 flag=3 Cumflag=4 Priorflag=1
请注意,对于vid=2的第一条记录,执行time lag()时的CumFlag值为2。这意味着将值2放入滞后队列。然后,对于vid=2的第二条记录,当执行滞后时,CumFlag的值为0,因此该值被输入滞后队列并返回2


顺便说一句,有条件的滞后函数可以正常工作。理解滞后的关键是记住它是一个队列。

同意Tom的观点。建议添加PUT语句,以便查看值

data b;
set a;
by vid;
 Cumflag+flag;
   /*Keep track of prior record running total*/
   Priorflag=lag(Cumflag);
   put (vid flag CumFlag PriorFlag)(=) ;
    if first.vid then do;
   Cumflag=flag;
   Priorflag=0;
end;
run;
返回

vid=1 flag=0 Cumflag=0 Priorflag=.
vid=1 flag=1 Cumflag=1 Priorflag=0
vid=1 flag=1 Cumflag=2 Priorflag=1
vid=1 flag=0 Cumflag=2 Priorflag=2
vid=2 flag=0 Cumflag=2 Priorflag=2  ***
vid=2 flag=0 Cumflag=0 Priorflag=2  ***
vid=2 flag=0 Cumflag=0 Priorflag=0
vid=2 flag=2 Cumflag=2 Priorflag=0
vid=3 flag=0 Cumflag=2 Priorflag=2
vid=3 flag=0 Cumflag=0 Priorflag=2
vid=3 flag=1 Cumflag=1 Priorflag=0
vid=3 flag=3 Cumflag=4 Priorflag=1
请注意,对于vid=2的第一条记录,执行time lag()时的CumFlag值为2。这意味着将值2放入滞后队列。然后,对于vid=2的第二条记录,当执行滞后时,CumFlag的值为0,因此该值被输入滞后队列并返回2

顺便说一句,有条件的滞后函数可以正常工作。理解滞后的关键是记住它是一个队列。

函数是一个大小为
的FIFO堆栈/队列
LAG
只是一个包含一个项目的堆栈

LAG(变量)在调用时执行以下操作:

  • 从堆栈底部检索返回值
  • 将所有堆栈值向下移动1
  • 将变量值推送到堆栈顶部
在具有的数据步骤中无条件使用
LAG
,将返回先前隐式迭代的变量值;与
SET
一起使用时,返回的值通常是前一行的值。

函数是大小为
的FIFO堆栈/队列
LAG
只是一个包含一个项目的堆栈

LAG(变量)在调用时执行以下操作:

  • 从堆栈底部检索返回值
  • 将所有堆栈值向下移动1
  • 将变量值推送到堆栈顶部

在具有的数据步骤中无条件使用
LAG
,将返回先前隐式迭代的变量值;
SET的典型用法
会导致返回的值是前一行的值。

Tom,请您进一步解释。Tom,请您进一步解释。对于第一个代码,对于id#2,记录1,第一个记录的累积标志最初设置为2(结转),并且前一个标志也是2(滞后函数),然后由于它是id#2的第一个记录,累积标志和前一个标志都将重置为0。然后SAS将转到id#2,记录2,以定义累计值和优先值。到那时,前一个值应该已经滞后于前一个值为0的累积值。那么,为什么id#2 record#2在输出中有一个先验值2呢?因为对id 2的LAG()的第一次调用会将CUMFLAG的值推入,即2,那么LAG()语句下次运行时会返回该值。你会感到困惑,因为CUMFLAG的值在被LAG()函数捕获后发生了更改。Tom,请你进一步解释。Tom,请你进一步解释。对于第一个代码,对于id#2,记录1,第一个记录的累积标志最初设置为2(结转),并且前一个标志也是2(滞后函数),然后由于它是id#2的第一个记录,累积标志和前一个标志都将重置为0。然后SAS将转到id#2,记录2,以定义累计值和优先值。到那时,前一个值应该已经滞后于前一个值为0的累积值。那么,为什么id#2 record#2在输出中有一个先验值2呢?因为对id 2的LAG()的第一次调用会将CUMFLAG的值推入,即2,那么LAG()语句下次运行时会返回该值。您会感到困惑,因为在LAG()函数捕获CUMFLAG后,它的值发生了更改。选择使用变量名
PriorFlag
会误解它真正扮演的角色
PriorCumFlag
,尤其是当已经存在
标志
变量时。Richard,感谢您的评论。同意。选择使用变量名
PriorFlag
误解了它真正扮演的角色是
priorcumlag
,尤其是当已经有
标志
变量时。Richard,谢谢你的评论。同意,谢谢你,昆汀。我爱