data aaa;
input id a b;
cards;
1 1.1 2
2 1.2 4
3 1.3 4
4 1.0 1
;
run;
/*数据集拼接*/
proc sql;
create table aaa_new as
select* from aaa,aaa(rename=(id = id1 a = a1 b = b1));
quit;
/*删除ID相同的观测,并求差值*/
data aaa_new;
set aaa_new;
if id = id1 then delete;
diff = abs(a-a1);
run;
/*排序,为后续做准备*/
proc sort data = aaa_new;
by id diff;
run;
/*让每个ID的第一个DIFF为9999,这是为了使第一行变成最小值,方便使用LAG函数*/
data aaa_new1;
set aaa_new;
by id;
if first.id = 1 then diff = 9999;
run;
proc sql;
select id, a, b, (b1+lag(b1))/2 as c from aaa_new1
group by id
having diff = min(diff);
quit;
/*求变量C*/
data aaa_final;
set aaa_new1;
c = (b1+lag(b1))/2;
output;
run;
/*输出结果,在输出窗口*/
proc sql;
select id, a, b, c from aaa_final
group by id
having diff = min(diff);
quit;
data try;
input id a b;
cards;
1 1.1 2
2 1.2 4
3 1.3 4
4 1.0 1
;
run;
proc sort data = try out = a;
by a;
run;
data a;
n = _N_;
set a;
run;
data b;
set a;
do i = 1 to nobs;
set a( keep = b rename=( b = nb))nobs = nobs point = i ;
output;
end;
run;
data c;
set b;
m = _N_;
run;
proc sql ;
create table m as
select a.id,a,b,c
from a join (select distinct n , id ,mean(nb) as c
from(select * from c
where( n=1 and (m = 2 or m = 3))or ((n >1 and n<4)and (m = 5*n-5 or m = 5*n -3)) or (n =4 and(m = 14 or m =15)))as d
group by n)as n
on a.n = n.n
order by id;
quit;