楼主: Tigflanker
1775 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 发表于 2014-1-2 20:36:39 |AI写论文
100论坛币
  1. data x;
  2. input u a b $;
  3. cards;
  4. 1 1 i
  5. 1 2 u
  6. 1 3 o
  7. 1 3 p
  8. 1 5 y
  9. 2 1 p
  10. 2 4 o
  11. 2 5 y
  12. ;
复制代码

如上数据集,得到结果如下:

1 1 i
1 2 u
1 3 o
1 3 p
1 4 p
1 5 y
2 1 p
2 2 p
2 4 o
2 5 y

规则如下:
想做一个a = 1 to 5的循环,对于每一个u,如果没有某条a,例如(u = 1;a = 4),并且(u = 1;a = 4 - 1)是有的。
则按照前一条观测向下retain。

求解答,谢谢。

自己写的毛坯程序,当然是错的,注意直接运行SAS会卡死。。

  1. data x;set x;
  2.   aa = a;
  3. run;

  4. data x;
  5.   if 0 then set x;
  6.   if _n_ = 1 then do;
  7.     dcl hash h(dataset:'x');
  8.         h.definekey('u','a');
  9.         h.definedata(all:'Y');
  10.         h.definedone();
  11.         
  12.     dcl hash g(dataset:'x');
  13.         g.definekey('u','aa');
  14.         g.definedata(all:'Y');
  15.         g.definedone();
  16.   end;
  17.   
  18.   set x;
  19.     by u a aa;
  20.   output;
  21.   
  22.   if first.u then do;
  23.     do a = 1 to 5;
  24.     aa = a - 1;
  25.       if h.find(key:u,key:a) and not g.find(key:u,key:aa) then do;
  26.           /*          */
  27.                     output;
  28.       end;
  29.     end;
  30.   end;
  31. run;
复制代码



最佳答案

zhengbo8 查看完整内容

跟上次一样,加个判断的变量。 结果对了。不知道是否满足你的要求。 有个问题,就是a如果重复出现,在retain时,没想到特别好的解决方法。 我只想到暂时用data步把hash进内存的表提前做了修改。
关键词:Dummy HASH Has Defined dataset 程序
Bye SAS.
若有缘,能重聚。

沙发
zhengbo8 发表于 2014-1-2 20:36:40
跟上次一样,加个判断的变量。
  1. data x;
  2. input u a b $;
  3. cards;
  4. 1 1 i
  5. 1 2 u
  6. 1 3 o
  7. 1 3 p
  8. 1 5 y
  9. 2 1 p
  10. 2 4 o
  11. 2 5 y
  12. ;

  13. proc sort;by u a;run;
  14. data x1;
  15.     set x;
  16.     by u a;
  17.     if last.a;
  18. run;

  19. data y;

  20.         if 0 then set x1;
  21.         if _n_ = 1 then do;
  22.                 declare hash h(dataset:'x1');
  23.                 h.definekey('u','a');
  24.                 h.definedata(all:'yes');
  25.                 h.definedone();
  26.         end;

  27.         set x;
  28.         by u a;
  29.         output;      

  30.         if first.u then do;
  31.                 flag=1;
  32.                 do a=1 to 5;
  33.                         if h.find(key:u,key:a) then do;
  34.                                 if flag=1 then do;
  35.                                         h.replace();
  36.                                         output;
  37.                                         flag=0;
  38.                                 end;
  39.                         end;
  40.                 end;
  41.         end;
  42.         drop flag;      
  43. run;

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

结果对了。不知道是否满足你的要求。
有个问题,就是a如果重复出现,在retain时,没想到特别好的解决方法。
我只想到暂时用data步把hash进内存的表提前做了修改。





藤椅
zhengbo8 发表于 2014-1-2 20:46:00
规则没看懂,再描述下。

板凳
Tigflanker 发表于 2014-1-2 21:26:55
zhengbo8 发表于 2014-1-2 20:46
规则没看懂,再描述下。
好的。

规则如下:

想对于每一个u做一个a = 1 to 5的循环,判断

如果对于某个u没有某条a,例如(u = 1时;没有a = 4),并且u = 1时;a = 4 的上一个数 a = 3 是有的。

则按照这个上一条的观测在此插入一条观测。

有点像上次做的那个DUMMY,只不过这次如果中间不连的话,就不做DUMMY,

例如 a = 1,2,5 缺少3和4的观测,把3按照他前面的2复制一条观测并插入数据集;4前面的3缺失,就把4直接略过。
Bye SAS.
若有缘,能重聚。

报纸
zhengbo8 发表于 2014-1-2 21:28:21
如果上一个数a=3也没有,是不是要插两个。
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
Tigflanker + 1 + 1 + 1 见上。

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

地板
Tigflanker 发表于 2014-1-3 09:39:56
zhengbo8 发表于 2014-1-2 21:50
跟上次一样,加个判断的变量。
结果对了。不知道是否满足你的要求。
有个问题,就是a如果重复出现,在ret ...
用起来是对的!非常感谢,中午休息时,我再好好理解一下,3Q大神!!
Bye SAS.
若有缘,能重聚。

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

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