1

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

2 回答 2

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;

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

于 2014-10-15T21:33:24.300 回答
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;
于 2014-10-15T21:07:44.733 回答