我有以下数据:
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”的缺失值? (不使用合并,因为真实数据集非常大)。
答案 0 :(得分:1)
您可以使用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;