我对SAS中的do循环很新,我知道我正在尝试使这个循环像MATLAB脚本一样工作。我没有在网上找到很多有用的提示,因为大多数do-loop示例仅用于计算,而不是实际检查以查看当前行之前的行是否具有相同的值。
这是我需要解决的问题:
我想查看下面的每个政策编号,看看之前的政策编号是否相同,如果是,我想标记它。
Policy
26X0118907
26X0375309
26X0375309
26X0527509
我认为i=1
是第一个政策(26X0118907
),i=2
是第二个政策(26X0375309
)。
在这种情况下,根据下面的代码(不起作用),此增量将标记为“B”。你知道如何正确编码这样的情况吗?
data AF_Inforce_&thestate.;
set AF_Inforce_&thestate.;
by Rating_St;
if first.Rating_St then counter=0;
counter+1;
myloop:
do i=2 to counter;
P2(i)=Policy(i);
P1(i)=Policy(i-1);
if P1(i)=P2(i) then flag='A';
else flag='B';
end;
return;
run;
答案 0 :(得分:3)
您需要从MATLAB或类似语言学习的第一件事是SAS是不同的。特别是,DATA步骤是它自己的DO循环,循环遍历记录。
其次,跨行访问数据有点复杂。但是,有一些技巧。
Vasja向你展示了一个(lag
,它实际上没有进入以前的记录,但有点像它一样)。除了比较之外,dif
做同样的事情,所以如果你的policynum是数字的,那么Vasja的代码可以改写为dif(policy)=0
而不是policy=lag(policy)
(尽管这只适用于数字) )。
在我看来,一个更好的技巧是使用by
组处理。通常情况下,这适用于已排序的字段,但是如果排序它并不重要:您只想知道两个连续的行是否相同,对吗?
data want;
set have;
by rating_st policy notsorted;
if first.policy and last.policy then recflag='A';
else if first.rating_st then recflag='A';
else recflag='B';
run;
我不知道我完全理解你的规则,但他们可能会成为某种形式。我把两种可能性放在那里,你可能只想要第二种(即你不在乎它是单数还是只是第一种)。第一个只标记单一政策。
答案 1 :(得分:2)
尝试查看LAG函数("记住"队列中变量的值)
您的代码应该是这样的:
data AF_Inforce_&thestate.;
set AF_Inforce_&thestate.;
by Rating_St;
if first.Rating_St = 0 and Policy=LAG(Policy) then flag='A';
else flag='B';
run;