我有以下数据:
data test ;
INPUT id st end ;
datalines ;
1 17 .
1 17 .
1 17 17.5
1 17 .
1 17 .
2 15 .
2 15 .
2 15 .
2 15 .
2 15 15.75
run ;
data test2 ;
set test ;
dur = end - st ;
run ;
我想用"id"填写"dur"的缺失值,给出:
id st end dur
1 17 . 17.5
1 17 . 17.5
1 17 17.5 17.5
1 17 . 17.5
2 15 . 15.75
2 15 . 15.75
2 15 . 15.75
2 15 . 15.75
2 15 15.75 15.75
由于行不按任何顺序使用proc sort
和retain
,如何替换"dur"的缺失值?(不使用合并,因为实际数据集非常大(。
您可以
按照自己所说的使用 proc sort
和 retain
来实现正确的 dur 列,但它不会为您提供与示例输出相同的结构:
proc sort data = test;
by id descending end;
run;
data test2 ;
set test ;
by id;
retain dur;
if first.id then dur = end - st ;
run;
然后test2
看起来像:
id st end dur
1 17 17.5 0.5
1 17 . 0.5
1 17 . 0.5
1 17 . 0.5
1 17 . 0.5
2 15 15.75 0.75
2 15 . 0.75
2 15 . 0.75
2 15 . 0.75
2 15 . 0.75
但是,如果数据变得太大,proc sort
可能会非常慢。proc SQL
方法可能更有用:
proc sql;
create table test2 as
select id, st, end, max(end-st) as dur
from test
group by id;
quit;