例如:
date value
1/1/1990 1
1/1/1991 2
我想要的结果是
date value
1/1/1990 1
2/1/1990 1
3/1/1990 1
...
1/1/1991 2
2/1/1991 2
3/1/1991 2
...
我调查了PROC EXPAND
程序,但它没有按照我的意愿行事。不知道如何以有效的方式做这么简单的事情。
由于
答案 0 :(得分:1)
您应该可以使用PROC EXPAND执行此操作,但在数据步骤中它也是微不足道的。
data want;
merge have have(firstobs=2 rename=(date=last_date) keep=date);
if not missing(last_date) then do date=date to (last_date-1);
output;
end;
keep date value;
run;
这是一个前瞻性合并,您可以将数据集合并到自身,并从顶部移除一行。
它不适用于最后一行,除非你a)添加了额外的最后一行,或b)写了一条规则专门适用于最后一行。
如果你总是把这一行从一年的第一年转换到一年的最后一年,那么它也可能比这更容易写。
data want;
set have;
do date = date to intnx('Year',date,1,'s');
output;
end;
run;
要使用PROC EXPAND执行此操作,您可以执行此操作:
proc expand data=have out=want from=year to=day method=aggregate;
id date;
run;
同样,它需要一个'最终'添加行以执行您想要的操作 - 它不会超过最后观察到的行;但如果需要的话,这似乎并不困难。如果你有固定的时间间隔,我会在这里使用第二种方法;如果你的时间间隔没有固定,我会使用其他方法之一(如果需要,可以添加最终观察)。