统计211

标题: SAS: 根据要求查找缺失值 [打印本页]

作者: 275932488    时间: 2011-6-23 13:28
标题: SAS: 根据要求查找缺失值
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;







欢迎光临 统计211 (http://www.tj211.com/) Powered by Discuz! X3.2