hplcdadong 发表于 2014-7-12 00:52 
*The following example will drop all values between 1 and 0 of var1 (include 1 and 0) and  should be ...
smart idea!cool!
我来试着解释一下二楼的思路,有不对的地方请各位坛友指出
1. 楼主的问题是希望当var1满足某一特定值时开始执行删除命令(含该obs),直到遇到另一个特定值时停止(含该obs)
在简例中,第一个值是1,第二个值是0。要删除var1等于这两个特定值的obs,无疑是简单的。难点在于,如何删除上述两种情形之间的那些obs。
2. 二楼的 
hplcdadong 坛友以他的视角将这个问题加以简化,以简例来说,要删除的是var1从1开始,到等于0结束以及这之间的所有obs,【但是】不能删除(或者说 保留)var1等于0之后的obs,直到再次出现var1的值等于1时为止(不保留该obs)。再简单的说,就是删除var1等于1到0之间的obs(含首尾的obs),但不能删除var1等于0到1之间的obs(不含首尾的obs)。
如果我们按照var1的取值对54万行的obs加以分类的话,A类是var1的取值为1或0的obs,对A类再细分的话,A1是var1的取值为1的obs,A2是var1的取值为0的obs;B类是var1的取值为其它值的obs。在B类中,又可以细分为两个子类:B1类是var1的取值在1到0之间的obs;B2是var2的取值在0到1之间的obs。
如果我们按照楼主的目标对54万行的obs加以分类的话,可以划分为两类:需要删除的obs,设为C1,需要保留的obs,设为C2
经过上述分类,我们不难发现,要删除的是{C1}={A1, A2, B1},需要保留的是 {C2}={B2}
现在来看二楼的 
hplcdadong 坛友的命令:
gen var2=var1 if inlist(var1,1,0)      
// 这句命令的思路就是把所有的obs划分为A、B两类:在var2的取值上就是,如果var1等于1或0,那么var2的取值就复制该取值,满足inlist条件的obs,就是所谓的A类。
// 而如果var1的取值不是0或1,那么var2就将其全部变为missing value,也就是说,var2的取值为missing value的obs,都是B类
replace var2=var2[_n-1] if var2==.
// 这句命令的思路就是把B类再细分为需要删除的B1类,和需要删除的B2类
也就是对于var2等于missing value的所有obs,如果该obs的var2的取值在1之后,那么将其missing取值更替为1,这就是所谓的B1类,即需要删除的obs类型中的一种,即此时var2等1的obs实际上包括两个分类:原本就取值为1的obs(复制自var1),这是需要删除的A1类,以及取值由missing值更替为1的obs,这就是需要删除的B1类;如果该obs的var2的取值在0之后,那么将其missing取值更替为0,这就是所谓的B2类,即需要保留的obs;【但要注意的是】实施上述更替后,var2的取值为0的obs实际上包括两类(A2类和B2类),即原本就取值为0的obs(复制自var1),这是需要删除的A2类,以及取值由missing值更替为0的obs,这就是需要保留的C2类,也即B2类。
drop if var1==0 | var2==1
// 【关键的删除时刻来到了】经过上述操作以及俺的分析,我们现在知道,要删除的A2类就是 满足if条件中的 var1==0 的obs,以及需要删除的A1类和B1类就是 满足if条件中的 var2==1的obs。
OK,任务完成了。
【最后,对不起各位,我嘴太笨!】