SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 1713|回复: 10
打印 上一主题 下一主题

再求教:如何写dummy变量最快?

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2009-7-26 21:59:15 | 只看该作者

再求教:如何写dummy变量最快?

比如说我的行业有100个,逐个逐个写dummy是不可能的。
我猜应该先把所有的行业名称读到一个宏变量然后从宏变量里面逐个逐个gen dummy。但是我不知道怎样实现。
请问有人知道怎样做最快吗?
非常感谢!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2009-7-27 00:24:11 | 只看该作者

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]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2009-7-27 13:53:28 | 只看该作者

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"
有没有办法实现呢?
回复 支持 反对

使用道具 举报

0

主题

0

帖子

2

积分

新手上路

Rank: 1

积分
2
地板
发表于 2009-7-27 13:58:50 | 只看该作者

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]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2009-7-27 16:43:17 | 只看该作者

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]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2009-7-28 07:23:21 | 只看该作者

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
;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2009-7-28 08:19:59 | 只看该作者

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.
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
8#
 楼主| 发表于 2009-7-28 10:45:19 | 只看该作者

Re: 再求教:如何写dummy变量最快?

死猪头
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
9#
 楼主| 发表于 2009-7-30 02:13:23 | 只看该作者

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
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
10#
 楼主| 发表于 2009-8-14 21:39:25 | 只看该作者

Re: 再求教:如何写dummy变量最快?

谢谢大家热心的帮助。
我最后用了sun的macro。
如果sql后加个noprint就更好了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2025-6-13 19:42 , Processed in 0.073612 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表