楼主: Tigflanker
1751 5

[问答] 请教如何用HASH做DUMMY [推广有奖]

  • 8关注
  • 18粉丝

副教授

49%

还不是VIP/贵宾

-

威望
0
论坛币
2321 个
通用积分
9.9128
学术水平
179 点
热心指数
194 点
信用等级
167 点
经验
27443 点
帖子
622
精华
0
在线时间
851 小时
注册时间
2011-3-27
最后登录
2023-5-14

楼主
Tigflanker 发表于 2013-12-25 16:13:54 |AI写论文
100论坛币
看过论坛很多高手用HASH,我自己也测试用HASH对比SQL对上百兆的数据进行条件MERGE,速度能快一倍。

我想请问一个问题:我想要用HASH在一个data步内将某个数据集DUMMY完善,这样就不用每次折腾来来去去,也有效率。

例如我有如下数据集:需要考虑两个变量,一个是分组变量U,另一个是用来检测是否完整的变量A,剩下的是杂七杂八的不少变量(不是只有B一个,而是有很多,数值型的、字符型的都有)。

data x;
input u a b $;
cards;
1 5 i
1 2 u
1 3 o
1 1 p
1 7 y
2 5 p
2 3 o
2 8 i
2 2 u
2 7 y
;
run;

需要:我想看看A中的值是否从1到9都有,没有的话就补上。

例如Dummy后的数据集如下:
1 5 i
1 2 u
1 3 o
1 1 p
1 7 y
1 4 (missing)
1 6 (missing)
1 8 (missing)
1 9 (missing)
2 ... ...

目前我打算这样做:
  1. data y;
  2. if 0 then set a;
  3. if _n_ = 1 then do;
  4.   dcl hash h(dataset:'x');
  5.   h.definekey('a');
  6.   h.definedata(all:'yes');
  7.   h.definedone();
  8. end;

  9. set x;
  10. by u;
  11. output;

  12. if first.u then do;
  13.   do a = 1 to 9;
  14.       if h.find(key:a) then do;b='';output;end;
  15.   end;
  16. end;
  17. run;

  18. proc sort;by u a;run;
复制代码

可是结果并不是想要的,另外: if h.find(key:a) then do;b='';output;end;  这句话也只能call missing一个B,如果有很多呢。。

恳请一定用HASH来做,SQL和MERGE都可以我明白、不过要绕路。

谢谢,如果忙的话就请无视,这个也不着急。
祝大家圣诞快乐先~~~

最佳答案

zhengbo8 查看完整内容

对于call missing,详见https://bbs.pinggu.org/thread-2806024-1-1.html
关键词:Dummy HASH Has 如何用 missing 如何
Bye SAS.
若有缘,能重聚。

沙发
zhengbo8 发表于 2013-12-25 16:13:55
对于call missing,详见https://bbs.pinggu.org/thread-2806024-1-1.html

  1. data x;
  2. input u a b $;
  3. cards;
  4. 1 5 i
  5. 1 2 u
  6. 1 3 o
  7. 1 1 p
  8. 1 7 y
  9. 2 5 p
  10. 2 3 o
  11. 2 8 i
  12. 2 2 u
  13. 2 7 y
  14. ;

  15. proc sort;by u a;run;

  16. data y;

  17.         if 0 then set x;
  18.         if _n_ = 1 then do;
  19.                 declare hash h(dataset:'x');
  20.                 h.definekey('u','a');
  21.                 h.definedata(all:'yes');
  22.                 h.definedone();
  23.         end;

  24.         set x;
  25.         by u a;
  26.         output;       

  27.         if first.u then do;
  28.                 do a=1 to 9;
  29.                         if  h.find(key:u,key:a) then do;
  30.                                 call missing(b);
  31.                                 h.replace();
  32.                                 output;       
  33.                         end;
  34.                 end;
  35.         end;
  36.                
  37. run;

  38. proc sort;by u a;run;
复制代码


已有 1 人评分学术水平 热心指数 信用等级 收起 理由
Tigflanker + 1 + 1 + 1 It's what I want, 3Q~~~~~

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

藤椅
Tigflanker 发表于 2013-12-25 16:31:51
MERGE这样就行了:
  1. data want1(keep = u a);set x;
  2. by U;

  3. if first.U then do a = 1 to 9;
  4.   output;
  5. end;
  6. run;

  7. proc sort data = x;by u a;
  8. data want;
  9.   merge x want1;
  10.   by u a;
  11. run;
复制代码
Bye SAS.
若有缘,能重聚。

板凳
Tigflanker 发表于 2013-12-26 10:57:02
zhengbo8 发表于 2013-12-25 16:13
对于call missing,详见https://bbs.pinggu.org/thread-2806024-1-1.html
不好意思,我自己加变量的时候,把B的$搞掉了。。
现在没事了。。

我能多问一句话吗?因为我要dummy进去的话,相当于新插入的行,我希望原来的B值不设空,只把新插入的行设空,请问如何修改呢?

谢谢。

例如Dummy后的数据集如下:
1 5 i
1 2 u
1 3 o
1 1 p
1 7 y
1 4 (missing)
1 6 (missing)
1 8 (missing)
1 9 (missing)
2 ... ...
Bye SAS.
若有缘,能重聚。

报纸
yongyitian 发表于 2013-12-26 11:06:40
Tigflanker 发表于 2013-12-26 10:57
我能多问一句话吗?因为我要dummy进去的话,相当于新插入的行,我希望原来的B值不设空,只把新插入的行设 ...
Not sure if this is what you want.
  1. data yy;
  2.   if 0 then set x;
  3.   if _n_ =1 then do;
  4.       declare hash h (dataset: 'x');
  5.       h.definekey('u', 'a');
  6.       h.definedata(all: 'y');
  7.       h.definedone();
  8.   end;
  9.   do u= 1, 2;
  10.     do a = 1 to 9;
  11.       rc = h.find();
  12.       if rc ^= 0 then call missing(b);
  13.       output;
  14.   end; end;
  15.   drop rc;
  16. run;   
复制代码
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
Tigflanker + 1 + 1 + 1 感谢帮助!问题已解决。

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

地板
Tigflanker 发表于 2014-1-2 20:40:41
zhengbo8 发表于 2013-12-25 16:13
对于call missing,详见https://bbs.pinggu.org/thread-2806024-1-1.html
有空的话,请帮我看下这个,谢谢:

https://bbs.pinggu.org/forum.php? ... ;extra=#pid23058065
Bye SAS.
若有缘,能重聚。

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

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