【问题标题】:SAS Do-Loop and IF Statement to compare Current and previous row valuesSAS Do-Loop 和 IF 语句来比较当前和前一行的值
【发布时间】:2014-10-15 20:41:31
【问题描述】:

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

【问题讨论】:

    标签: if-statement sas do-loops


    【解决方案1】:

    您需要从 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;
    

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

    【讨论】:

      【解决方案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;
      

      【讨论】:

      • 我会避免使用 lag() 函数,除非在极少数情况下同时需要多个延迟。 (例如stackoverflow.com/questions/25898255/…)原因是lag() 太容易被误用和误解,尤其是在存在条件逻辑的情况下。如果您的if 语句被转换成嵌套的if 语句,那么结果将会改变,而不会通知用户。这可能导致难以调试和未检测到的错误。按组处理更安全。
      猜你喜欢
      • 2021-09-28
      • 1970-01-01
      • 2018-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-29
      相关资源
      最近更新 更多