全部版块 我的主页
论坛 计量经济学与统计论坛 五区 计量经济学与统计软件 Stata专版
27635 9
2014-07-12
悬赏 150 个论坛币 已解决
问题见下表
主体名 变量1变量2
a 7 .
b 1
c 5
d 3
e 9
f 0
g 12
       如何编程可以达到以下目的:当变量1出现数字1时,删除整行数据,并且开始依次删除后面的数据,直到变量1为0时停止.以上面表为例,删除后变成下表。
主体名 变量1变量2
a 7 .
g12
        PS:1.需要处理的数据集一共有54万行,存在上述需要删除的地方有几千处,请不要说自己观察然后逐行删除。
                2.真实的处理要求,是当变量1满足某一特定值时开始执行删除命令,遇到另一个特定值时停止,上面的例子为简单起见,以0和1代替。
        希望各位高手能不吝赐教,万分感谢

最佳答案

hplcdadong 查看完整内容

*The following example will drop all values between 1 and 0 of var1 (include 1 and 0) and should be what you want. clear input id var1 1 5 2 8 3 1 4 6 7 15 8 0 9 15 10 1 11 3 12 0 13 25 14 28 15 1 end gen var2=var1 if inlist(var1,1,0) replace var2=var2[_n-1] if var2==. drop if var1==0 | var2==1 drop var2
二维码

扫码加我 拉你入群

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

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

全部回复
2014-7-12 00:52:57
*The following example will drop all values between 1 and 0 of var1 (include 1 and 0) and  should be what you want.

clear
input id var1        
1 5
2 8
3 1
4 6
7 15
8 0
9 15
10 1
11 3
12 0
13 25
14 28
15 1
end

gen var2=var1 if inlist(var1,1,0)
replace var2=var2[_n-1] if var2==.
drop if var1==0 | var2==1
drop var2
二维码

扫码加我 拉你入群

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

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

2014-7-12 09:10:02
本人才疏学浅,记忆中stata貌似没有终止命令,只能介绍你删除命令

命令:drop in range if var==1

变量说明:
1. range指的是你处理数据的行数,譬如你处理的数据有54万行,那你range就是1/540000,这里"/"是“-”的意思。
2. var便是你数据中的变量名称,var==1表示你的变量恒等于数据1。

命令说明:
假如你有54万行数据,当变量1(var1)出现数据1时,删除整行数据,直到遇到0为止。那么命令可以使:
drop in 1/540000 if var1==1
二维码

扫码加我 拉你入群

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

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

2014-7-12 16:51:54
hplcdadong 发表于 2014-7-12 08:44
*The following example will drop all values between 1 and 0 of var1 (include 1 and 0) and  should be ...
我问了几个人都搞不定,我还以为实现不了这个问题,没想到这么简单就实现了,佩服
二维码

扫码加我 拉你入群

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

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

2014-7-12 16:54:08
gjpig55 发表于 2014-7-12 09:10
本人才疏学浅,记忆中stata貌似没有终止命令,只能介绍你删除命令

命令:drop in range if var==1
你好,可能我讲的不是很清楚,你这个命令貌似只能删除变量为1的那一行,1和0之间夹着的所有行无法删除,不过还是感谢
二维码

扫码加我 拉你入群

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

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

2014-7-16 09:23:47
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}

分类.png

现在来看二楼的 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,任务完成了。

【最后,对不起各位,我嘴太笨!】


二维码

扫码加我 拉你入群

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

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

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群