五一前正在出差去贵州的高铁上接到一位EpiMan坛友的咨询,具体内容如下:
我想实现“删除地址重复的个案,只保留id最小的那个观测” Stata code怎么写啊?我在网上看的code 是给重复观测 重新分配一个随机数 然后删掉随机数>1 的 不太符合要求。
id addr keep 3 2 Y 4 2 N 5 2 N 1 1 Y 2 1 N 6 3 Y 7 3 N
当初手机上回复的思路:
这个应该不难。 先bys 地址 id,然后每个地址生成一个变量从1-N,保留1的记录。
结果测试总是不成功,最后她使用gemini解决的,但是代码比较繁琐。 今天晚上闲下来,我电脑上测试了一下,发现当初手误,bys第二个变量id少了一对括弧。
以下是演示过程:
1️⃣ 载入数据
//载入Stata演示数据
input id addr
3 2
4 2
5 2
1 1
2 1
6 3
7 3
end
list ,sepby(addr)
2️⃣ 生成变量
//每个地址按id生成一个变量从1-n
bys addr (id): gen wanted=_n
list ,sepby(addr)
3️⃣ 删除记录
//保留值为1的记录
keep if wanted==1
list ,sepby(addr)
drop wanted
这里最关键就是bysort命令: bysort varlist1 [(varlist2)] [, rc0]: stata_cmd,意思是按照变量1 变量2进行排序,就是先按变量1排序,然后变量1里的记录再按照变量2排序。
以下是Stata的官方解释:
The varlist1 (varlist2) syntax is of special use to programmers. It verifies that the data are sorted by varlist1 varlist2 and then performs a by as if only varlist1 were specified.
For instance,
by pid (time): generate growth = (bp – bp[_n-1])/bp
performs the generate by values of pid but first verifies that the data are sorted by pid and time within pid.
完,本文内容交流请移步:https://www.epiman.cn/thread-294619-1-1.html