|
Datasets:
data data1;
input no x0 y0 a0 ab x1 x2 x3;
cards;
1 1 1 1 1 2 2 2
2 . . . . 1 1 1
3 1 2 3 4 . . .
4 . . 2 3 3 4 .
;
data data2;
input variable $ visit;
cards;
x0 1
y0 1
a0 1
ab 1
x1 2
x2 2
x3 2
;Expected dataset:
data1中no为编号(唯一),x0 y0 a0 ab为访视1的变量,x1 x2 x3为访视2的变量。现在核查缺失的情况:如果某个个体访视1的变量全部缺失,则查访视1的四个变量时忽略这个个体,访视2类似。结果如下:
no variable value
4 x0 .
4 y0 .
4 x3 .My Solution:
%macro missing;
proc sort data=data2;
by visit;
run;
data _null_;
set data2 end=eof;
by visit;
length var $ 32767;
retain var "";
if first.visit then do;
var="";
num+1;
n=0;
end;
n+1;
var=catx(" ",strip(var),strip(variable));
if last.visit then do;
call symputx("n_"||strip(put(num,best.)),strip(put(n,best.)));
call symputx("var_"||strip(put(num,best.)),strip(var));
end;
if eof then call symputx ("num",num);
run;
data tmp;
set data1;
%do i=1 %to &num.;
retain visit_&i._flag 0;
visit_&i._flag=0;
%do j=1 %to &&n_&i.;
%let vartmp=%scan(&&var_&i.,&j.,%str( ));
if not missing(&vartmp.) then visit_&i._flag=1;
%end;
%end;
run;
data want;
set tmp;
length variable $ 10;
%do i=1 %to &num.;
%do j=1 %to &&n_&i.;
%let vartmp=%scan(&&var_&i.,&j.,%str( ));
if missing(&vartmp.) and visit_&i._flag=1 then do;
variable="&vartmp.";
value=&vartmp.;
output;
end;
%end;
%end;
keep no variable value;
run;
%mend;
%missing;
|
|