SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 712|回复: 2
打印 上一主题 下一主题

怎么用一步hash实现重复值的计数

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2010-8-10 22:30:14 | 只看该作者

怎么用一步hash实现重复值的计数

要求用hash实现下面data步实现的功能。

[code:2xhffdk2]data ex;
input num1    num2;
cards;
2    1
2    1
2    1
2    1
5    1
5    2
5    1
5    2
6    1
6    5
6    2
6    5
6    5
6    1
6    5
6    2
;
proc sort;
by num1 num2;
run;
data ex;
    set ex;
          by  num1 num2;
           if first.num1 then k=0;
              k+1;        
           if last.num1  then  output;
run;

proc print;
run;[/code:2xhffdk2]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2010-8-11 09:09:31 | 只看该作者

Re: 怎么用一步hash实现重复值的计数

[code:2k7xb4cw]data ex;
        input num1 num2;
cards;
2    1
2    1
2    1
2    1
5    1
5    2
5    1
5    2
6    1
6    5
6    2
6    5
6    5
6    1
6    5
6    2
;
data _null_;
        if _n_=1 then
                do;
                        declare hash h(hashexp:16,ordered:'yes');
                        h.definekey('num1');
                        h.definedata('num1','num2','k');
                        h.definedone();
                        call missing(num1,num2,k);
                end;
        set ex(rename=(num2=temp)) end=last;
        if h.find()=0 then do;
                        k+1;
                        if temp>num2 then num2=temp;
                        rc=h.replace(key:num1,data:num1,data:num2,data:k);
                end;
        else rc=h.add(key:num1,data:num1,data:num2,data:1);
        if last then h.output(dataset:'out');
run;
proc print;
run;[/code:2k7xb4cw]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2010-8-11 11:56:04 | 只看该作者

Re: 怎么用一步hash实现重复值的计数

还缺一口气,.......

[code:17vzy9bc]data ex;
input num1    num2;
cards;
6    5
2    1
2    1
2    1
6    3
2    1
2    1
5    1
5    2
5    2
6    1
6    5
6    2
6    5
6    1
6    5
6    2
;
data ex1 ;
if _n_=1 then do;
      declare hash h(dataset:'ex', multidata: 'y');
           h.defineKey('num1','num2');
           h.defineData('num1', 'num2');
           h.defineDone();
      /* avoid uninitialized variable notes */
      call missing(num1,num2);
end;

   set ex end=end;  
          rc = h.find();
          if (rc = 0) then
               do;
                    count=1;
                    rc = h.find_next();       
                    do while(rc = 0);
                           count+1;       
                           rc = h.find_next();
                                        end;       
               end;       
drop rc;
run;
proc print;
run;[/code:17vzy9bc]
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-3 23:50 , Processed in 0.411260 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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