If statement SAS Do Loop和IF语句来比较当前行值和上一行值

If statement SAS Do Loop和IF语句来比较当前行值和上一行值,if-statement,sas,do-loops,If Statement,Sas,Do Loops,我是SAS中do循环的新手,我知道我正在努力使这个循环像MATLAB脚本一样工作。我还没有在网上找到很多有用的提示,因为大多数do循环示例只是用于计算,而不是实际检查当前行之前的行是否具有相同的值 以下是我需要解决的问题: 我想看看下面的每个保单编号,看看之前的一个是否相同,如果相同,我想标记它 Policy 26X0118907 26X0375309 26X0375309 26X0527509 我认为I=1是第一个方针26X0118907,I=2是第二个政策26X0375 309。 在这种情

我是SAS中do循环的新手,我知道我正在努力使这个循环像MATLAB脚本一样工作。我还没有在网上找到很多有用的提示,因为大多数do循环示例只是用于计算,而不是实际检查当前行之前的行是否具有相同的值

以下是我需要解决的问题:

我想看看下面的每个保单编号,看看之前的一个是否相同,如果相同,我想标记它

Policy
26X0118907
26X0375309
26X0375309
26X0527509

我认为I=1是第一个方针26X0118907,I=2是第二个政策26X0375 309。 在这种情况下,根据代码,低于此增量不工作的代码将标记为“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;
尝试查看函数,它记住队列中变量的值

您的代码应该如下所示:

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;
尝试查看函数,它记住队列中变量的值

您的代码应该如下所示:

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;

从MATLAB或类似语言中学习的第一件事是SAS是不同的。特别是,数据步骤是它自己的DO循环,在记录上循环

其次,跨行访问数据有点复杂。然而,这里有一些技巧

Vasja向你展示了一个滞后,它实际上并没有进入以前的记录,但有点像它。dif除了比较之外做同样的事情,所以如果您的policynum是数值的,那么Vasja的代码可以重写为difpolicy=0而不是policy=lagpolicy,尽管这只用于数值

在我看来,在你的案例中,一个更好的技巧是使用分组处理。通常情况下,这适用于排序字段,但在这里,它是否排序并不重要:您只想知道两个连续行是否相同,对吗

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;

我不知道我是否完全理解你的规则,但它们可能是某种形式的。我把这两种可能性放在那里,你可能只想要第二种,也就是说,你不在乎它是单数的还是第一种。第一种方法只标记单个策略。

从MATLAB或类似语言中学习的第一件事是SAS是不同的。特别是,数据步骤是它自己的DO循环,在记录上循环

其次,跨行访问数据有点复杂。然而,这里有一些技巧

Vasja向你展示了一个滞后,它实际上并没有进入以前的记录,但有点像它。dif除了比较之外做同样的事情,所以如果您的policynum是数值的,那么Vasja的代码可以重写为difpolicy=0而不是policy=lagpolicy,尽管这只用于数值

在我看来,在你的案例中,一个更好的技巧是使用分组处理。通常情况下,这适用于排序字段,但在这里,它是否排序并不重要:您只想知道两个连续行是否相同,对吗

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;

我不知道我是否完全理解你的规则,但它们可能是某种形式的。我把这两种可能性放在那里,你可能只想要第二种,也就是说,你不在乎它是单数的还是第一种。第一个只标记单个策略。

我不使用滞后函数,除非在极少数情况下需要同时使用多个滞后。这是因为滞后太容易被误用和误解,特别是当存在条件逻辑时。如果将If语句转换为嵌套的If语句,则结果将更改,而不会通知用户。这可能导致难以调试和未检测到的错误。分组处理要安全得多。我不会使用滞后函数,除非在极少数情况下需要同时使用多个滞后。这是因为滞后太容易被误用和误解,特别是当存在条件逻辑时。如果将If语句转换为嵌套的If语句,则结果将更改,而不会通知用户。这可能导致难以调试和未检测到的错误。分组处理更安全。