SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 844|回复: 5
打印 上一主题 下一主题

请教各位大侠一个SAS数据集生成的问题

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2010-7-5 12:28:25 | 只看该作者

请教各位大侠一个SAS数据集生成的问题

比如,我现在有两个表:
data a;
id='w x y z';
output;
id='a w';
output;
run;

data b;
input list;
cards;
w
z
y
x
a
;
run;

我想得到如下的结果:
id                               v1        v2         v3          v4        v5
w x y z                        0           1          1           1          1
a w                             1           0          0           0          1

其中,V1-V5代表的分别是a;x;y;z;w. 0表示id不含有V1-V5的值,1表示含有.比如:第一个id中的v1=0,表示第一个id不包含字符a,其余类似. 我现在用HASH实现代码如下:

data w;
    If 0 Then Set b;
    If _N_=1 Then Do;
            Declare Hash Share(Dataset:"b",ordered: 'yes');
        declare hiter iter("Share");
            Share.Definekey ('list');
            Share.Definedata('list');
            Share.Definedone();
    End;

        set a;
        word=0;
        retain word;
        length ar1-ar5 3;
        array ar[1:5]   ;

   length  main_word1  $50;
        rc=iter.first();

        iter_cnt=0;
        DO WHILE (rc=0);
        match_count=0;
        m=1;

        do while (compress(scan(id,m,' ')) ne '');
        main_word1=compress(scan(id,m,' '));
        if (main_word1 eq list) then do;match_count+1;leave;end;
        m+1;
        end;

        iter_cnt+1;
        ar(iter_cnt)=match_count;

        rc = iter.next();
    END;
run;

[b:1ylxshz2]我的问题是: 还有没有别的更高效的方法(可以用HASH),因为我想比较一下不同方法之间的效率(时间).多谢各位大侠帮助![/b:1ylxshz2]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2010-7-5 15:02:45 | 只看该作者

Re: 请教各位大侠一个SAS数据集生成的问题

[code:2ui4h6d1]data a;
        id='w xx yyyy z';
        output;
        id='a w';
        output;
run;
data b;
        input list $;
cards;
w
z
yyyy
xx
a
;
proc sql noprint;
        select list into:list separated by ',' from b;
quit;

proc fcmp outlib=work.func.ben;
        function test(in $,list $) $ 50;
                attrib out length=$50;
                do i=1 to countc(list,',')+1;
                        if index(in,scan(list,i))=0 then out=cats(out,'0');
                        else out=cats(out,'1');
                end;
                return(out);
        endsub;
run;
options cmplib=work.func;
data c;
        set a;
        temp=test(id,"&list");
run;[/code:2ui4h6d1]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2010-7-5 15:13:12 | 只看该作者

Re: 请教各位大侠一个SAS数据集生成的问题

多谢斑竹!不过,非常遗憾,我的SAS版本不是9.2的,所以不能运行proc fcmp. 我还是想用DATA步.不知道你有没有更好的解决方法? 再次感谢你的热心!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2010-7-5 16:27:43 | 只看该作者

Re: 请教各位大侠一个SAS数据集生成的问题

[code:1nx0w3gt]data a;
   id='w xx yyyy z';
   output;
   id='a w';
   output;
run;
data b;
   input list $;
   varname=cats('var',_n_);
   value=_n_;
cards;
w
z
yyyy
xx
a
;
proc transpose data=b out=c(drop=_name_);
        id varname;
        idlabel list ;
        var value;
run;
data c(drop=substr i);
        length substr $50;
        set a;
        if _n_=0 then set c;
        array arr{*} _numeric_;
        do i=1 to dim(arr);
                call label(arr(i),substr);
                arr(i)=ifn(indexw(id,substr),1,0);
        end;
run;[/code:1nx0w3gt]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2010-7-5 17:47:52 | 只看该作者

Re: 请教各位大侠一个SAS数据集生成的问题

学习了 <!-- s:) --><img src="{SMILIES_PATH}/icon_smile.gif" alt=":)" title="Smile" /><!-- s:) -->
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2010-7-6 11:12:29 | 只看该作者

Re: 请教各位大侠一个SAS数据集生成的问题

多谢斑竹热心! 我比较了一下,比我的程序效率提高了近20%,非常感谢! 不过,对其中的transpose过程步在大数据的情况下还是心有余悸.但是可以用DATA步解决transpose的问题.再次感谢!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-4 03:29 , Processed in 0.067710 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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