SAS Do-Loop和IF语句用于比较当前和以前的行值

时间:2014-10-15 20:41:32

标签: if-statement sas do-loops

我对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;

2 个答案:

答案 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;