SAS中文论坛

标题: 再求教:如何写dummy变量最快? [打印本页]

作者: shiyiming    时间: 2009-7-26 21:59
标题: 再求教:如何写dummy变量最快?
比如说我的行业有100个,逐个逐个写dummy是不可能的。
我猜应该先把所有的行业名称读到一个宏变量然后从宏变量里面逐个逐个gen dummy。但是我不知道怎样实现。
请问有人知道怎样做最快吗?
非常感谢!
作者: shiyiming    时间: 2009-7-27 00:24
标题: Re: 再求教:如何写dummy变量最快?
是根据变量清单创建模拟数据吗?
[code:24wyxak4]data a;
        input var_name $ var_type $;
datalines;
var1 n
var2 c
var3 n
var4 n
var5 c
;

%macro creat_var(ds);
        %let dsid=%sysfunc(open(&ds));
        %syscall set(dsid);
        %let nobs=%sysfunc(attrn(&dsid,nobs));
        %do i=1 %to &nobs;
        %let rc=%sysfunc(fetch(&dsid,&i));
                %if &var_type=n %then %do;
                                &var_name=ceil(10*ranuni(123));
                        %end;
                %else %do;
                                &var_name=put(ceil(2*ranuni(123)),8.);
                                &var_name=trim(left(&var_name));
                                &var_name=tranwrd(&var_name,'1','AAA');
                                &var_name=tranwrd(&var_name,'2','BBB');
                        %end;
        %end;
        %let rc=%sysfunc(close(&dsid));
%mend;

data b;
        do i=1 to 100;
                %creat_var(a)
                output;
        end;
run;[/code:24wyxak4]
作者: shiyiming    时间: 2009-7-27 13:53
标题: Re: 再求教:如何写dummy变量最快?
不是创建模拟数据。
比如说吧,我有10个行业(变量名是IND),编码从A-J。
firmcode    ind   
1                A   
2                A
3                C
4                D
...

现在我想生成dummy (哑变量),我就要写IND1 = IND= "A", IND2 = IND= "B"...,就变成这样:
firmcode    ind   IND1   IND2   IND3   IND4 ....
1                A      1         0       0         0
2                A      1         0       0         0
3                C      0         0       1         0
4                D      0         0       0         1
...

如果你有100个行业,就不可能逐个逐个写IND1 = IND = "A";这样。
我的想法是把所有的不同的ind读入一个宏变量,然后让程序自动写IND&i = IND = "XX"
有没有办法实现呢?
作者: Qiong    时间: 2009-7-27 13:58
标题: Re: 再求教:如何写dummy变量最快?
[code:1ro5s5rd]
data v;
input type $ @@;
cards;
a b c a b b c d
;
run;

%macro dummy_create(set=, var=);
proc sort data= &set(keep=&var.) out=temp1 nodupkey;
by &var.;
run;
data _null_;
set temp1;
call symput ('no', _n_ );
run;
proc sort data= &set ;
by &var.;
run;
data  &set(drop=n i);
retain n 0;
set  &set;
array &var._dummy(&no.) (&no.*0);
by &var.;
if first.&var. then n=n+1;
do i=1 to dim(&var._dummy);
if i=n then &var._dummy(i)=1;
else &var._dummy(i)=0;
end;
run;
proc datasets;
delete   temp1;
quit;
%mend dummy_create;
%dummy_create(set=v,var=type);[/code:1ro5s5rd]
作者: shiyiming    时间: 2009-7-27 16:43
标题: Re: 再求教:如何写dummy变量最快?
[code:2dezfuht]data a;
   input firmcode ind $ ind_no;
datalines;  
1 A        1
2 A        1
3 C        3
4 D        4
;

/* global macro variable: no */
data b;
        set a end=last;
        if no<ind_no then no=ind_no;
        if last then call symput ('no',trim(left(put(no,best.))));
run;

/* fetch obs */
%macro creat_var(ds);
        %let dsid=%sysfunc(open(&ds));
        %syscall set(dsid);
        %let nobs=%sysfunc(attrn(&dsid,nobs));
        array arr{&no} (%sysfunc(repeat(0%str( ),&no-1)));
        %do i=1 %to &nobs;
                %let rc=%sysfunc(fetch(&dsid,&i));
                firmcode=&firmcode;
                ind="&ind";
                arr(&ind_no)=1;
                output;
                arr(&ind_no)=0;
        %end;
        %let rc=%sysfunc(close(&dsid));
%mend;

/* creat dataset */
data b;
      %creat_var(a)
run;[/code:2dezfuht]
作者: shiyiming    时间: 2009-7-28 07:23
标题: Re: 再求教:如何写dummy变量最快?
data v;
input type $ @@;
cards;
a b c a b b c d
;
run;

proc sql noprint;
        select count(distinct type ) into :n from v
;
        %let n=&n
;
        select distinct quote(strip(type)) into :type_ separated by ' ' from v
;
        quit
;

data vDummy;
        set v;
        array t{*} type1-type&n;
        array t_{&n}  $ _temporary_   (&type_);
        do i=1 to &n;
                t{i}=0;
                if type=t_{i} then t{i}=1;
        end;
        drop i;
run
;
作者: shiyiming    时间: 2009-7-28 08:19
标题: Re: 再求教:如何写dummy变量最快?
Assign an unique value to each 行业, for
example 1 to A, 2 to B, and 10 to J.

order           行业
1                 A
1                 A
3                 C
4                 D

after done above, convert variable "order"
to binary value. Thait's it.
作者: shiyiming    时间: 2009-7-28 10:45
标题: Re: 再求教:如何写dummy变量最快?
死猪头
作者: shiyiming    时间: 2009-7-30 02:13
标题: Re: 再求教:如何写dummy变量最快?
假设根据一个字符型变量的值来产生:
proc sql;
          select distinct VarName into: values separated by ' '
                  from DataSet_name
                   where not missing(VarName);
         %let n=&sqlobs.;
quit;

%macro create_dumy;
    data DataSet_Name;
         set DataSet_Name;
             select(varname);
                  %do i=1 %to &n.;
                        %let val = %scan(&values.,&i);
                        when("&val.") dumy_&i =1;
                 %end;
                    otherwise put "ERROR: Missing value found";
             end;
     run;

%mend;

%create_dumy
作者: shiyiming    时间: 2009-8-14 21:39
标题: Re: 再求教:如何写dummy变量最快?
谢谢大家热心的帮助。
我最后用了sun的macro。
如果sql后加个noprint就更好了。
作者: shiyiming    时间: 2010-12-20 06:43
标题: Re: 再求教:如何写dummy变量最快?
use PROC GLMMOD




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