SAS中文论坛

标题: 如何更新数据集,谢谢! [打印本页]

作者: shiyiming    时间: 2011-8-3 05:45
标题: 如何更新数据集,谢谢!
data aaa;
infile cards missover;
input no var$ value$10.;
cards;
1 age 30
2 time 2009/10/03
3 x1 .
4 x2   
5 x3 正常
;
run;

data bbb;
input no age time x1 x2$ x3$;
format time yymmdd6.;
cards;
1 29 510317 1 y 正常
2 30 681224 2 n 异常
3 26 651128 3 y 异常
4 25 651128 4 n 异常
5 24 651128 5 y 异常
;
run;
/*根据数据集aaa更新数据集bbb中相应的变量值*/
作者: shiyiming    时间: 2011-8-3 10:45
标题: Re: 如何更新数据集,谢谢!
[code:3ps8y79l]data bbb(drop=i var value);
  set aaa;set bbb;
  array _num_{1:3} age time x1;
  array _char_{4:5} $ x2 x3;
  do i=1 to 5;
   if var=choosec(i,'age','time','x1','x2','x3') then do;
      if i le 3 then do;
          if var eq 'time' then _num_(i)=input(value,yymmdd10.);
          else _num_(i)=value;
          end;
          else _char_(i)=value;
          leave;
   end;
  end;
  format time yymmdd6.;
run;[/code:3ps8y79l]
作者: shiyiming    时间: 2011-8-3 12:07
标题: Re: 如何更新数据集,谢谢!
数据集中的变量很多!如何能通用啊!
作者: shiyiming    时间: 2011-8-4 09:52
标题: Re: 如何更新数据集,谢谢!
过程比较繁杂,将就下吧...
[code:14f79ceu]proc sql noprint;
create table test as
select name,type
from dictionary.columns
where libname='WORK' and memname='BBB';
quit;

proc sql noprint;
select name
into:num_list separated by ' '
from test
where name ne 'no' and type eq 'num';
select name
into:char_list separated by ' '
from test
where type eq 'char';
select count(name)-1
into:nn
from test
where type eq 'num';
select count(name)
into:nc
from test
where type eq 'num';
select count(name)-1
into:nv
from test;
quit;
%put  &num_list. &char_list. &nn. &nc. &nv.;

proc sort data=test;
by descending type;
run;

data _null_;
set test(firstobs=2);
array v{&nv};
call symputx(vname(v[_n_]), name);
run;

data bb(keep=no age time x1-x3);
  set aaa;set bbb ;
  array v{&nv};
  array _num_{1:&nn.} &num_list;
  array _char_{&nc.:&nv.} $ &char_list;
  do i=1 to &nv.;
     if var=symget(vname(v[i])) then do;
        if i le &nn. then do;
            if var eq 'time' then _num_(i)=input(value,yymmdd10.);
            else _num_(i)=value;
        end;
        else _char_(i)=value;
        leave;
     end;
  end;
  format time yymmdd6.;
run;
[/code:14f79ceu]




欢迎光临 SAS中文论坛 (https://mysas.net/forum/) Powered by Discuz! X3.2