SAS LAG功能问题(不在条件条款中)

时间:2019-09-05 18:58:27

标签: sas

带有LAG和if函数的代码无法按我期望的方式工作。我知道该如何纠正。但是,我正在寻求帮助以了解其原因。我知道滞后条件语句会出现问题,但是我的滞后功能不在if语句中。

我的第二个ID记录有问题。对于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遇到问题。

vid rid flag Cumflag Priorflag
1 1 0 0 0
1 2 1 1 0
1 3 1 2 1
1 4 0 2 2
2 1 0 0 0
2 2 0 0 2
2 3 0 0 0
2 4 2 2 0

Log file is here. 

vid=1 rid=1 flag=0 Cumflag=0
vid=1 rid=1 flag=0 Cumflag=0 Priorflag=.
vid=1 rid=1 Cumflag=0 Priorflag=0
vid=1 rid=2 flag=1 Cumflag=1
vid=1 rid=2 flag=1 Cumflag=1 Priorflag=0
vid=1 rid=3 flag=1 Cumflag=2
vid=1 rid=3 flag=1 Cumflag=2 Priorflag=1
vid=1 rid=4 flag=0 Cumflag=2
vid=1 rid=4 flag=0 Cumflag=2 Priorflag=2
vid=2 rid=1 flag=0 Cumflag=2
vid=2 rid=1 flag=0 Cumflag=2 Priorflag=2
vid=2 rid=1 Cumflag=0 Priorflag=0
vid=2 rid=2 flag=0 Cumflag=0
vid=2 rid=2 flag=0 Cumflag=0 Priorflag=2 (*** having question here, since cumflag=0 prior**)
vid=2 rid=3 flag=0 Cumflag=0
vid=2 rid=3 flag=0 Cumflag=0 Priorflag=0
vid=2 rid=4 flag=2 Cumflag=2
vid=2 rid=4 flag=2 Cumflag=2 Priorflag=0

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

同意汤姆。建议添加一条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的记录,执行lag()时CumFlag的值为2。这意味着将值2放入延迟队列。然后对于vid = 2的第二条记录,执行滞后时CumFlag的值为0,因此将此值输入到滞后队列中并返回2。

顺便说一句,延迟功能有条件地正常工作。理解延迟的关键是记住它是一个队列。

答案 2 :(得分:0)

import React from 'react'; import Header from './components/header'; import Sidebar from './components/sidebar'; import Content from './components/content'; function App() { return (<React.Fragment> <div className="header-container"> <div className="header" style={{ backgroundColor: 'red', color: 'white' }}> <h1>Header</h1> </div> </div> <div className="content-container"> <div className="sidebar" style={{ backgroundColor: 'blue', color: 'white' }}> <h1>Sidebar</h1> </div> <div className="content" style={{ backgroundColor: 'green', color: 'white' }}> <h1>Content</h1> <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p> </div> </div> </React.Fragment>); } export default App; 函数是大小为html, body { margin: 0 !important; padding: 0 !important; } body { height: 100% !important; overflow: hidden; } h1 { margin: 0; } #root { display: flex; flex-direction: column; } p { width: 30px; } .header-container { display: flex; flex: 0; } .content-container { display: flex; flex-direction: row; flex: 1; height: auto; } .header { padding: 10px 0; flex: 1; width: 100%; } .sidebar { flex: 0; padding: 0 10px; } .content { flex: 1; flex-grow: 1; } 的FIFO堆栈/队列。 LAG<n>()只是一个包含一个项目的堆栈。

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

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

在数据步骤with中无条件使用<n>将返回先前隐式迭代的变量值;与LAG的典型用法导致返回的值是上一行的值。