【问题标题】:SAS - Creating an error report based on lag dataSAS - 根据滞后数据创建错误报告
【发布时间】:2018-10-13 15:42:27
【问题描述】:

我需要从数据集创建(简单?)错误报告。 数据集如下所示:

Contract   DrvrNum   LicNum
 -------   -------   ---------
 2212621         2   8241323
 2212621         2   65256129
 6385371         1   973385261
 6385371         3   973385261
 2366922         1   B931151BA
 2366922         2   B931151BA
 1007922         1   60916004
 1007922         2   60916004

前 2 个观察结果表明我有两个不同的驾照号码用于同一司机,而接下来的三对观察结果表明我有两个或多个司机的驾照号码重复。

我的输出需要如下所示:

Contract   DrvrNum   LicNum     ErrorReason
 -------   -------   ---------  -----------
 2212621         2   8241323    
 2212621         2   65256129   Multiple License Numbers for Same Driver
 6385371         1   973385261
 6385371         3   973385261  Duplicate License Number
 2366922         1   B931151BA
 2366922         2   B931151BA  Duplicate License Number
 1007922         1   60916004
 1007922         2   60916004   Duplicate License Number

我尝试在数据步骤中使用 LAG() 函数并结合 first.Contract = 0,但由于其他所有观察结果都是 FALSE,因此得到了滞后值一切都乱了套,让我无法做类似的事情:

if LicNum = lag(LicNum) then ErrorReason = 'Duplicate License Number';
else ErrorReason = 'Multiple License Numbers for Same Driver';

如果有人能提供一些帮助,我将不胜感激。我对此束手无策。

谢谢!

【问题讨论】:

  • 尝试在数据步骤中使用 LAG() 函数并结合 first.Contract = 0,您可以显示该代码吗?它们是在单独的语句中还是在单个语句中合并。需要传递到下一次隐式循环迭代的值应存储在retained 变量中。

标签: sas


【解决方案1】:

LAG() 的值队列基于您执行 LAG() 函数的时间。它与数据集中的观察结果无关。所以通常你不想有条件地执行 LAG() 函数。因此,您应该无条件地将值分配给变量,然后您可以有条件地测试变量的值。

但是,如果每个合约有两个以上的观察值,LAG() 将无法解决您的问题。 试试这样的方法来跟踪合同下的所有许可证号。

data have ;
  input Contract :$10. DrvrNum LicNum :$10. ;
cards;
2212621 2 8241323
2212621 2 65256129
6385371 1 973385261
6385371 3 97338526x
6385371 3 973385261
2366922 1 B931151BA
2366922 2 B931151BA
1007922 1 60916004
1007922 2 60916004
;

data want ;
   set have ;
   by contract drvrnum licnum notsorted;
   length ErrorReason $100 LicenseList $200 ;
   retain licenselist ;
   if first.contract then licenselist=LicNum;
   else do;
     if indexw(licenselist,LicNum,' ') then
       ErrorReason = catx(' ',ErrorReason,'Duplicate License Number.')
     ;
     else licenselist=catx(' ',licenselist,licnum);
     if first.licnum and not first.drvrnum then
       ErrorReason = catx(' ',ErrorReason,'Multiple License Numbers for Same Driver.')
     ;
   end;
run;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-05
    • 2021-01-29
    • 1970-01-01
    • 2020-02-18
    • 2019-08-18
    • 1970-01-01
    • 2014-11-19
    相关资源
    最近更新 更多