我希望通过另一个变量的组(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解决这个问题,但我也认为这不是最有效的方法。
答案 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或改进我的代码。