我需要从数据集中创建一个(简单的?)错误报告。 数据集如下所示:
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';
如果有人可以提供帮助,我将不胜感激。我的智慧就此终结了。
谢谢!
答案 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;