楼主: numman
10489 11

[原创博文] 求教关于sas hash 中在分类数据中的用法 [推广有奖]

  • 0关注
  • 5粉丝

已卖:93份资源

博士生

29%

还不是VIP/贵宾

-

威望
0
论坛币
3161 个
通用积分
0
学术水平
14 点
热心指数
15 点
信用等级
9 点
经验
2974 点
帖子
199
精华
0
在线时间
276 小时
注册时间
2009-12-8
最后登录
2016-9-18

楼主
numman 发表于 2011-2-21 11:29:07 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
我现在有张想放进hash 里的表,他是个分类表,就是在某一类别中,key才是唯一的。
由于hash表联接时key要唯一,怎样可以不用把此表按照类别拆分成一个一个小表后再连
因为我的表很大,类别比较多,用sql或拆分后不是很慢就是生成很多张表。

比如 表A
kind     id
a          1
a          2
b          1
b          3
c          2
c          3

表B
id     amt
1       50
2       40
2       20
3       30

我想要得到kind(类别)   a   b   c 类下所有id 的总amt额。。想用hash 做  求教高手
十分感谢。。。sql   join  再group by实在太慢了。。
二维码

扫码加我 拉你入群

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

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

关键词:分类数据 HASH Has Group kind

回帖推荐

275769263 发表于2楼  查看完整内容

首先说一下,哈希表的关键字是可以不唯一的,如下可以实现。详细请看http://www.pinggu.org/bbs/thread-1062169-1-1.html data data1; input kind$ id$; cards; a 1 a 2 b 1 b 3 c 2 c 3 ; run; data data2; input id$ amt; cards; 1 50 2 40 2 30 3 30 ; run; data result1; length kind$ 8 id$ 8; if _n_=1 then d ...

本帖被以下文库推荐

沙发
275769263 发表于 2011-3-30 22:58:52
首先说一下,哈希表的关键字是可以不唯一的,如下可以实现。详细请看http://www.pinggu.org/bbs/thread-1062169-1-1.html
data data1;
input kind$ id$;
cards;
a          1
a          2
b          1
b          3
c          2
c          3
;
run;
data data2;
input id$ amt;
cards;
1       50
2       40
2       30
3       30
;
run;
data result1;
length kind$ 8 id$ 8;
if _n_=1 then do;
  declare hash h1(dataset:'data1',ordered:'y', multidata: 'y');
  h1.definekey('id');
  h1.definedata('id','kind');
  h1.definedone();
  call missing(id,kind);
end;
do while(not last1);
  set data2 end=last1;
  h1.find();
  output;
  h1.has_next(result:r);
  do while(r ne 0);
   h1.find_next();
   output;
   h1.has_next(result:r);
  end;
end;
run;
data _null_;
length kind$ 8 id$ 8;
if _n_=1 then do;
  declare hash h2(ordered:'y');
  h2.definekey('kind');
  h2.definedata('id','kind','total');
  h2.definedone();
  call missing(id,kind,total);
end;
do while(not done);
  set result1 end=done;  
   if h2.find()=0 then do;
   total+amt;
   h2.replace();
   end;
   else do;
   total=amt;
   h2.add();
   end;
end;
h2.output(dataset:'result2');
run;
已有 1 人评分学术水平 热心指数 收起 理由
numman + 1 + 1 十分感谢您的帮助

总评分: 学术水平 + 1  热心指数 + 1   查看全部评分

藤椅
numman 发表于 2011-8-28 15:06:55
275769263 发表于 2011-3-30 22:58
首先说一下,哈希表的关键字是可以不唯一的,如下可以实现。详细请看http://www.pinggu.org/bbs/thread-106 ...
不过这样有个问题  hash表中的数据集就必须排过序了。。那这样的话不如 把data2也排序 进行merge了

板凳
hopewell 发表于 2011-8-28 18:19:19
  1. data A;
  2.     input kind $ id;
  3. datalines;
  4. a 1
  5. a 2
  6. b 1
  7. b 3
  8. c 2
  9. c 3
  10. ;
  11. data fmt;
  12.     set a;
  13.     retain fmtname 'idfmt' type 'n' hlo 'm';
  14.     rename id=start kind=label;
  15. run;
  16. proc format cntlin=fmt; run;
  17. data B;
  18.     input id amt;
  19. datalines;
  20. 1 50
  21. 2 40
  22. 2 20
  23. 3 30
  24. ;
  25. proc means data=b noprint;
  26.     var amt;
  27.     class id/ mlf;
  28.     format id idfmt.;
  29.     output out=C sum=Sum;
  30. run;
复制代码
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
Tigflanker + 1 + 1 + 1 精彩帖子!!

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

观钓颇逾垂钓趣 种花何问看花谁

报纸
numman 发表于 2011-8-28 22:03:58
hopewell 发表于 2011-8-28 18:19
呵呵  hopewell 你好啊。。

means过程对大量数据就是个杯具。。再加上format..

我这个问题其实主要想解决G级数据的处理的...要不然就直接 sql了么。。

用format反而有点绕了。。不过也不失为一种方法  感谢。

望闲来无事支持下小弟的 daaata.com

地板
hopewell 发表于 2011-8-28 22:40:32
  1. data A;
  2.     input kind $ kid;
  3. datalines;
  4. a 1
  5. a 2
  6. b 1
  7. b 3
  8. c 2
  9. c 3
  10. ;
  11. data B;
  12.     input id amt;
  13. datalines;
  14. 1 50
  15. 2 40
  16. 2 20
  17. 3 30
  18. ;
  19. data _null_;
  20.     length kind $8;
  21.     if _n_=1 then do;
  22.         declare hash h1(dataset:'a',hashexp:16,ordered:'y');
  23.         h1.defineKey('kid','kind');
  24.         h1.defineDone();
  25.         call missing(kid,kind);
  26.         declare hiter hi('h1');
  27.         declare hash h2(hashexp:8,ordered:'y');
  28.         h2.defineKey('kind');
  29.         h2.defineData('kind','sum');
  30.         h2.defineDone();
  31.         call missing(kind,sum);
  32.     end;
  33.     set b end=last;
  34.     rc=hi.first();
  35.     do until(hi.next() ne 0);
  36.         if id=kid then do;
  37.             if h2.find() then rc=h2.add(key:kind,data:kind,data:amt);
  38.             else rc=h2.replace(key:kind,data:kind,data:sum+amt);
  39.         end;
  40.     end;
  41.     if last then rc=h2.output(dataset:'work.c');
  42. run;
复制代码
已有 3 人评分学术水平 热心指数 信用等级 收起 理由
Tigflanker + 2 + 2 + 2 在画画
275769263 + 1 + 1 + 1 思想很好...程序很简洁...佩服呀...
zhangzachary + 1 + 1 + 1 膜拜hopewell大大~~ 我已经看不懂了……

总评分: 学术水平 + 4  热心指数 + 4  信用等级 + 4   查看全部评分

观钓颇逾垂钓趣 种花何问看花谁

7
soporaeternus 发表于 2011-8-29 09:40:15
B表id=2有2个值是什么意思?
Let them be hard, but never unjust

8
jingju11 发表于 2011-8-29 23:52:12
hopewell 发表于 2011-8-28 18:19
in fact, I came across a problem of using MLF option years ago. The problem is, the number of format items can be no more than 26(?). If it is still so (I did not trace this issue further), that may limit the usage here. But for sure, MLF option can be intractable sometimes.
Jingju

9
numman 发表于 2011-9-14 08:53:17
hopewell 发表于 2011-8-28 22:40
hopewell jingju 果然sas程序界两大巨头哇。。。感谢

10
smallflower 发表于 2011-12-11 22:51:46
学习了

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-6 04:14