我正在处理家庭数据集,我的数据如下:
input id id_family mother_id male
1 2 12 0
2 2 13 1
3 3 15 1
4 3 17 0
5 3 4 0
end
我想做的是确定每个家庭的母亲。母亲是该家庭的成员,其id
等于另一个家庭成员的mother_id
之一。在上面的例子中,对于id_family
= 3的家庭,个人5有mother_id
= 4,这使得个人4成为她的母亲。
我创建了一个家庭大小变量,告诉我每个家庭有多少成员。我还为一个家庭中的每个成员创建一个等级变量。对于三口之家,我可以使用以下代码:
bysort id_family: gen family_size=_N
bysort id_family: gen rank=_n
gen mother=.
bysort id_family: replace mother=1 if male==0 & rank==1 & family_size==3 & (id[_n]==id[_n+1] | id[_n]==id[_n+2])
bysort id_family: replace mother=1 if male==0 & rank==2 & family_size==3 & (id[_n]==id[_n-1] | id[_n]==id[_n+1])
bysort id_family: replace mother=1 if male==0 & rank==3 & family_size==3 & (id[_n]==id[_n-1] | id[_n]==id[_n-2])
我得到的是:
id id_family mother_id male family_size rank mother
1 2 12 0 2 1 .
2 2 13 1 2 2 .
3 3 15 1 3 1 .
4 3 17 0 3 2 1
5 3 4 0 3 3 .
然而,在我的实际数据集中,我必须得到大小为4及更高(最多9)的系列的mother
,这使得此过程非常低效(从某种意义上说,行数太多要“手动”比较的元素。
您如何以更清洁的方式获得此信息?你会利用排列来对行进行索引吗?或者你会使用for循环?
答案 0 :(得分:1)
这是一种使用合并的方法。
// create sample data
clear
input id id_family mother_id male
1 2 12 0
2 2 13 1
3 3 15 1
4 3 17 0
5 3 4 0
end
save families, replace
clear
// do the job
use families
drop id male
rename mother_id id
sort id_family id
duplicates drop
list, clean abbreviate(10)
save mothers, replace
use families, clear
merge 1:1 id_family id using mothers, keep(master match)
generate byte is_mother = _merge==3
list, clean abbreviate(10)
第二个列表产生
id id_family mother_id male _merge is_mother
1. 1 2 12 0 master only (1) 0
2. 2 2 13 1 master only (1) 0
3. 3 3 15 1 master only (1) 0
4. 4 3 17 0 matched (3) 1
5. 5 3 4 0 master only (1) 0
我保留_merge仅用于说明目的。