楼主: evarei2
27741 9

[数据管理求助] stata 如何选择性的删除若干行数据,150论坛币求高手解答 [推广有奖]

  • 0关注
  • 2粉丝

已卖:2183份资源

硕士生

99%

还不是VIP/贵宾

-

威望
0
论坛币
9663 个
通用积分
30.6619
学术水平
15 点
热心指数
15 点
信用等级
10 点
经验
304 点
帖子
60
精华
0
在线时间
353 小时
注册时间
2009-11-16
最后登录
2021-11-23

楼主
evarei2 发表于 2014-7-12 00:52:56 |AI写论文
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
关键词:50论坛币 Stata 求高手解答 tata 0论坛币 选择性 如何

沙发
hplcdadong 发表于 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
已有 6 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
orangehc + 1 + 1 + 1 精彩帖子
txje + 1 + 1 + 1 热心帮助其他会员
lambert0205 + 1 + 1 + 1 观点有启发
hiderm + 1 + 1 热心帮助其他会员
evarei2 + 1 + 1 + 1 精彩帖子
crystal8832 + 20 + 1 + 1 热心帮助其他会员

总评分: 论坛币 + 20  学术水平 + 6  热心指数 + 6  信用等级 + 4   查看全部评分

藤椅
gjpig55 发表于 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
已有 1 人评分论坛币 学术水平 热心指数 收起 理由
crystal8832 + 20 + 1 + 1 热心帮助其他会员

总评分: 论坛币 + 20  学术水平 + 1  热心指数 + 1   查看全部评分

板凳
evarei2 发表于 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 ...
我问了几个人都搞不定,我还以为实现不了这个问题,没想到这么简单就实现了,佩服

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

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

地板
hiderm 发表于 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,任务完成了。

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


已有 4 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
Sunknownay + 3 + 3 + 3 热心帮助其他会员
洛阳富才雄1 + 1 + 1 + 1 精彩帖子
txje + 1 + 1 + 1 热心帮助其他会员
evarei2 + 5 + 1 + 1 精彩帖子

总评分: 论坛币 + 5  学术水平 + 6  热心指数 + 6  信用等级 + 5   查看全部评分

7
wfldragon 发表于 2014-7-16 16:10:40
很清晰的思路,我之前也是这么干的

8
lambert0205 发表于 2014-7-18 13:03:42
2楼大赞!

9
panlileijian 发表于 2014-8-5 09:17:50
很受启发

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

命令:drop in range if var==1
试了,可以做到,谢谢~

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

本版微信群
加好友,备注jltj
拉您入交流群
GMT+8, 2026-1-24 12:16