楼主: jungsee
6414 13

删除指定条件的数据 [推广有奖]

11
jungsee 发表于 2014-3-27 16:31:13
466046020 发表于 2014-3-27 13:04
Another way:
data a;
input id target $ year invest;
谢谢大神,这里,您的code有一定的风险,例如,我的数据(e.g id=1)增加几行后,处理的结果是错误的:
data a;
input id target $ year invest;
cards;
1 a 2004 0
1 b 2004 1
1 c 2004 0
1 d 2004 1
1 a 2005 0
1 b 2005 0
1 c 2005 1
1 d 2005 0
1 a 2007 1
1 a 2009 1
1 b 2009 1
1 c 2009 1
1 d 2009 1
2 a 2007 1
2 b 2007 1
2 c 2007 0
2 d 2007 0
2 a 2009 0
2 b 2009 0
2 c 2009 0
2 d 2009 1
;
run;

12
jungsee 发表于 2014-3-30 23:07:18
pobel 发表于 2014-3-27 12:53
data b;
   if 0 then set a;
   if _n_=1 then do;
大神,程序的最后两句没有看明白,能否稍微解释一下,我也在google上查询了有关哈希表在SAS中应用的文档,但是这两句 if h.find()=0 then delete;  if invest=1 then h.add();   为什么:第一句表示( 找到了删除) 第二句(找到了满足invest=1条件 后添加),这两句组合后是: 一直搜素找到 invest=1 的记录后终止(搜索关键词为'id'+'target')。难道是: if h.find()=0  语句 是根据下一句的 条件( if invest=1。。)来运行的???如果是这样,为什么 两条语句的顺序 不能 改变呢?(我试了改变顺序后的计算结果,输出不一样)。


求大神指点一下。谢谢!!!

13
pobel 在职认证  发表于 2014-3-31 09:34:26
jungsee 发表于 2014-3-30 23:07
大神,程序的最后两句没有看明白,能否稍微解释一下,我也在google上查询了有关哈希表在SAS中应用的文档 ...
add()那句是要把invest=1的ID+TARGET组合添加到hash表中;
find()那句是说如果hash表中已经有了这个ID+TARGET组合,那就删掉。

这里并没有“一直搜索”的意思。还是应该按照正常的data步去理解,也就是“逐条处理,顺序运行”。
对于当前处理记录:
1. find(): 如果hash表中有相对应的ID+TARGET,则说明之前已经遇到过,就需要删去。
   (这里如果执行了delete语句,那之后的语句都会跳过,而直接转到DATA语句。)
2. add(): 如果invest=1, 就把这个ID+TARGET组合加到hash表中。

如果顺序变化的话,每一句的功能不会变,只是最后的效果却不一样。例如执行到到第二行
    1 b 2004 1
1. add(): invest=1,所以把ID=1,TARGET=b加到hash表中;
2. find(): 在hash表中找到了对应的ID+TARGET,删掉。
和谐拯救危机

14
jungsee 发表于 2014-3-31 09:39:42
pobel 发表于 2014-3-31 09:34
add()那句是要把invest=1的ID+TARGET组合添加到hash表中;
find()那句是说如果hash表中已经有了这个ID+T ...
完完全全明白了,谢谢大神的指点迷津!!!

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

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