SAS-根据滞后数据创建错误报告

时间:2018-10-13 15:42:28

标签: sas

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

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

前两个观察结果表明我为同一位驾驶员拥有两个不同的驾照编号,而接下来的三对观察结果表明我为两个或多个驾驶员重复了一个驾照编号。

我的输出应如下所示:

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

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

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

如果有人可以提供帮助,我将不胜感激。我的智慧就此终结了。

谢谢!

1 个答案:

答案 0 :(得分: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;

enter image description here