Stata(家庭数据集)中多行的比较

时间:2015-10-21 21:14:59

标签: loops row stata

我正在处理家庭数据集,我的数据如下:

 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循环?

1 个答案:

答案 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仅用于说明目的。