添加索引(如果它不存在)并复制最近的值

时间:2014-04-25 01:54:10

标签: sas

我希望通过另一个变量的组(days将数据集中的记录添加到某个ID(date)的每个值,从1到特定表中该id的最小值。 ),并且对于最小id记录具有的另一个变量具有相同的值(rate)。我的解释很可能不太清楚,请看下面的例子。

我有以下数据集myrate

     date   days   rate
02JAN1996      5   5.76
02JAN1996     10   5.81
02JAN1996     15   5.41
03JAN1996      6   5.76
03JAN1996     12   5.75
03JAN1996     13   5.74

我的预期结果如下

     date   days   rate
02JAN1996      1   5.76
02JAN1996      2   5.76
02JAN1996      3   5.76
02JAN1996      4   5.76
02JAN1996      5   5.76
02JAN1996     10   5.81
02JAN1996     15   5.41
03JAN1996      1   5.76
03JAN1996      2   5.76
03JAN1996      3   5.76
03JAN1996      4   5.76
03JAN1996      5   5.76
03JAN1996      6   5.76
03JAN1996     12   5.75
03JAN1996     13   5.74

我真的很无能为力 - 我已经用宏来解决这个问题,它为每个组找到最小的days并输出必要的行。但我无法将这个想法转化为代码。另外,我假设有一种更简单的方法可以使用数据步骤。

编辑:我相信我可以用PROC IML解决这个问题,但我也认为这不是最有效的方法。

2 个答案:

答案 0 :(得分:3)

可以按照以下方式完成:

proc sort data=myrate; by date days; run;
根据Joe的评论

更新

data want;
  set myrate;
  by date;
  if FIRST.date then do;
    do days=1 to days;
       output;
    end;
  end;
  else output;
run;

答案 1 :(得分:0)

接受的答案是方式,方式,比我的数据集的以下代码更有效。然而,在@ Joe的评论之后,我尝试用PROC IML开发我想到的解决方案。

然而,这是我使用的:

proc iml;
    use myrate;
    read all var{date days rate} into mymatrix;
    unique_rows = uniqueby(mymatrix,1,1:nrow(mymatrix));
    do i=1 to nrow(unique_rows);
        if mymatrix[unique_rows[i],2] ^= 1 then do;
            currdays = mymatrix[unique_rows[i],2];
            h = J(currdays-1,1,mymatrix[unique_rows[i],1]) || (1:currdays-1)` || J(currdays-1,1,mymatrix[unique_rows[i],3]);
            mymatrix = insert(mymatrix,h,unique_rows[i]);
            unique_rows = unique_rows + currdays - 1;
        end;
    end;
    create want from mymatrix;
    append from mymatrix;
    close want;
quit;

对于包含15,979,017个观测值和4452个按群组的数据集,此代码采用:

PROCEDURE IML used (Total process time):
real time           8:59.22
cpu time            8:59.50

虽然上面的数据步骤采取了:

DATA statement used (Total process time):
real time           2.95 seconds
cpu time            2.22 seconds

这证明我的解决方案并不好。也许有更好的方法来使用PROC IML或改进我的代码。