我有一个包含以下变量的大型Stata数据集:year
,state
,household_id
,individual_id
,partner_id
和race
。以下是我的数据示例:
year state household_id individual_id partner_id race
1980 CA 23 2 1 3
1980 CA 23 1 2 1
1990 NY 43 4 2 1
1990 NY 43 2 4 1
注意,在上表中,列1和2彼此结合。如果这个人处于异族婚姻中,我想创建一个变量。
作为第一步,我使用了以下代码
by household_id year: gen inter=0 if race==race[partner_id]
replace inter=1 if inter==.
此代码运行良好,但在少数情况下给出了错误的结果。作为替代方案,我创建了一个字符串变量,用于标识每个用户及其合作伙伴
gen id_user=string(household_id)+"."+string(individual_id)+string(year)
gen id_partner=string(household_id)+"."+string(partner_id)+string(year)
我现在要做的是创建类似vlookup
在Excel中所做的事情:对于每一列,在本地保存id_partner,在id_user中找到它并找到它们的种族,并将其与原始用户的种族进行比较。
我想它应该是这样的?
gen inter2==1 if (find race[idpartner]) == (race[iduser])
预期的输出应该是这样的
year state household_id individual_id partner_id race inter2
1980 CA 23 2 1 3 1
1980 CA 23 1 2 1 1
1990 NY 43 4 2 1 0
1990 NY 43 2 4 1 0
我认为你不需要那么一般的东西。正如您所知,有关标识符的信息足以找到情侣,而这又可以让race
与每对情侣的人进行比较。
在下面的代码中,_N == 2
用于捕获数据错误,例如一个伙伴而不是另一个伙伴是数据集中的观察或一个伙伴或两者的重复。
clear
input year str2 state household_id individual_id partner_id race
1980 CA 23 2 1 3
1980 CA 23 1 2 1
1990 NY 43 4 2 1
1990 NY 43 2 4 1
end
generate couple_id = cond(individual_id < partner_id, string(individual_id) + ///
" " + string(partner_id), string(partner_id) + ///
" " + string(individual_id))
bysort state year household_id couple_id : generate mixed = race[1] != race[2] if _N == 2
list, sepby(household_id) abbreviate(15)
+-------------------------------------------------------------------------------------+
| year state household_id individual_id partner_id race couple_id mixed |
|-------------------------------------------------------------------------------------|
1. | 1980 CA 23 2 1 3 1 2 1 |
2. | 1980 CA 23 1 2 1 1 2 1 |
|-------------------------------------------------------------------------------------|
3. | 1990 NY 43 4 2 1 2 4 0 |
4. | 1990 NY 43 2 4 1 2 4 0 |
+-------------------------------------------------------------------------------------+
这个想法记录在this article中。该链接提供免费访问pdf
文件。