全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
1339 2
2014-01-17
悬赏 100 个论坛币 已解决
请各位帮我个忙,我要做一个put和input转换,但是需要由另一个数据集来决定哪些变量做转换。

首先提供下数据集:

复制代码

数据集A是需要操作的数据集,数据集B是指示数据集。

A中的变量,例如usubjid是数值型的,RFSTD是字符型的,x是字符型的。
然后数据集B中包含两个值,分别是A的usubjid(注意是小写)和RFSTDT,故按照B中NAME所指示的变量名,做类型转换。
(也就是把usubjid(原本是TYPE = 2,字符型)input成best.;把RFSTDT (原本是TYPE = 1,数值型)put成best.并加个strip)

我要做的话,感觉用array(vname) + hash或者array(vname) + 宏变量,来做;但是貌似最烦的地方都要做新变量再整体rename,因为要考虑普适性,array TYPE_ALLVAR _char_;而不能做全部变量,越想越麻烦。

不知有无直白点的方法,万分感谢,在线等。
  

最佳答案

YLF870214 查看完整内容

这是我以前实习时写的宏,希望对你有帮助: data a; attrib usubjid length = 8; attrib RFSTDT length = $8; usubjid = 12345; x='aaa'; RFSTDT = '12345';output; run; data b; input NAME $ TYPE; cards; RFSTDT 1 USUBJID 2 ; run; %macro ADM_TYPE(in=,out=&in.); proc contents data = &in. out = ADM_TEMP3;run; data ADM_TEMP3(keep = NAME TYPE1);set ADM_TEMP3; NAME = upcase(NAME); TY ...
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2014-1-17 19:45:28
这是我以前实习时写的宏,希望对你有帮助:

data a;
attrib usubjid length = 8;
attrib RFSTDT length = $8;
  usubjid = 12345;
  x='aaa';
  RFSTDT = '12345';output;
run;
data b;
input NAME $ TYPE;
cards;
RFSTDT 1
USUBJID 2
;
run;
%macro ADM_TYPE(in=,out=&in.);
proc contents data = &in. out = ADM_TEMP3;run;
data ADM_TEMP3(keep = NAME TYPE1);set ADM_TEMP3;
  NAME = upcase(NAME);
  TYPE1 = TYPE;
run;
%let ADM_TYPE_ALLVAR=;
%let ADM_TYPE_ALLCHAR_TEMP=;
%let ADM_TYPE_ALLNUM_TEMP=;      
proc sort data = ADM_TEMP3;by NAME;run;
proc sort data = b;by NAME;run;
data ADM_TEMP4;
merge ADM_TEMP3 b(keep = NAME TYPE in = yes);
by NAME;
if TYPE ^= TYPE1 and yes then do;
  call symputx('ADM_TYPE_ALLVAR',symget('ADM_TYPE_ALLVAR')||' '||strip(NAME));
end;
run;
data _null_;
  set &in.;
  array ADM_TYPE_ALLCHAR _char_;
  array ADM_TYPE_ALLNUM _numeric_;
  if _N_ = 1 then do;
    do over ADM_TYPE_ALLCHAR;
      call symputx('ADM_TYPE_ALLCHAR_TEMP',symget('ADM_TYPE_ALLCHAR_TEMP')||' '||upcase(vname(ADM_TYPE_ALLCHAR)));
    end;

    do over ADM_TYPE_ALLNUM;
      call symputx('ADM_TYPE_ALLNUM_TEMP',symget('ADM_TYPE_ALLNUM_TEMP')||' '||upcase(vname(ADM_TYPE_ALLNUM)));
    end;
  end;
run;
data &out.;set &in.;
  %do i = 1 %to %eval(%sysfunc(count(&ADM_TYPE_ALLCHAR_TEMP.,%str( ))) + 1);
  %let ADM_TYPE_WHICH = %scan(&ADM_TYPE_ALLCHAR_TEMP.,&i.);
    %if %index("&ADM_TYPE_ALLVAR",&ADM_TYPE_WHICH.) %then %do;
      &ADM_TYPE_WHICH._X = input(&ADM_TYPE_WHICH.,best.);
      drop &ADM_TYPE_WHICH.;
      rename &ADM_TYPE_WHICH._X = &ADM_TYPE_WHICH.;
   %end;
  %end;
  
  %do i = 1 %to %eval(%sysfunc(count(&ADM_TYPE_ALLNUM_TEMP.,%str( ))) + 1);
  %let ADM_TYPE_WHICH = %scan(&ADM_TYPE_ALLNUM_TEMP.,&i.);
    %if %index("&ADM_TYPE_ALLVAR",&ADM_TYPE_WHICH.) %then %do;
      &ADM_TYPE_WHICH._X = strip(put(&ADM_TYPE_WHICH.,best.));
      drop &ADM_TYPE_WHICH.;
      rename &ADM_TYPE_WHICH._X = &ADM_TYPE_WHICH.;
   %end;
  %end;
run;
%mend ADM_TYPE;
%ADM_TYPE(in=a,out=c);


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-1-19 14:11:47

data a;
input id lastname  $ sex age $;
cards;
1234 AFD 1 23
2365 FDG 2 35
8762 JKK 1 41
;
run;

data b;
input NAME $ TYPE $ ;
cards;
id    C
sex   C
age   N
;
run;

proc sql;
select name into:varlist_C separated by ' ' from b where type='C';
select cats('_',name) into:_varlist_C separated by ' ' from b where type='C';
select name into:varlist_N separated by ' ' from b where type='N';
select cats('_',name) into:_varlist_N separated by ' ' from b where type='N';
quit;

data want;
  if 0 then set b;
  if _n_=1 then do;
  declare hash h(dataset:'b');
  h.definekey('name','type');
  h.definedata(all:'y');
  h.definedone();
  end;
  set a;
  array change_type_c $ &varlist_c;
  array _change_type_c $ &_varlist_c;
  array change_type_n  &varlist_n;
  array _change_type_n  &_varlist_n;
   do over change_type_c;
    _name=vname(change_type_c);
        _type=vtype(change_type_c);
        rc=h.find(key:_name,key:_type);
        if rc^=0 then do;
                  _change_type_c=put(change_type_c,8.);
        end;
        end;
  do over change_type_n;
    _name=vname(change_type_n);
        _type=vtype(change_type_n);
        rc=h.find(key:_name,key:_type);
        if rc^=0 then do;
                  _change_type_n=input(change_type_n,best8.);
        end;
        end;
        keep lastname &_varlist_c  &_varlist_n;
    run;

proc sql;
  select name||'='||compress(name,'_') into: all_name separated by ' ' from dictionary.columns
      where libname='WORK' and memname='WANT' and name contains '_';
  quit;

proc datasets lib=work nolist;
modify want;
rename &all_name;
run;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群