我有一个大型数据集,每个观察代表一个家庭;变量是家庭特征(地点,姓氏)或家庭成员的特征,例如家庭成员。 age_member1, age_member2, edu_member1, edu_member2
以及更多,50名成员。
我想用任何计数来找出移民和非移民之间的差异,例如:教育水平是否不同(3 =大学)。此代码可查找家庭中有多少人拥有大学学位:
egen uni_member = anycount (edu_member*), values(3)
现在我想只计算那些移民的人,可能还有if条件:
egen uni_migrant = anycount (edu_member*) if migr_member*=1, values(3)
但这是错误的,因为if必须引用单个变量......任何帮助?
答案 0 :(得分:2)
我建议使用reshape
将数据放入long
格式。按行工作是可能的,但我通常觉得它更麻烦。例如:
clear all
set more off
*----- example data -----
input ///
hh uni1 age1 migr1 uni2 age2 migr2 uni3 age3 migr3
1 1 23 0 0 54 1 0 38 1
2 0 16 0 1 48 1 0 40 0
end
list
*----- what you want -----
reshape long uni age migr, i(hh) j(member)
bysort hh: egen counthh = total(uni == 1 & migr == 1)
list, sepby(hh)
这使得家庭1有一名成员既是移民又受过大学教育。如果需要,您可以reshape
返回wide
格式。见help reshape
。
如果你坚持按行工作,你可以从Nick Cox的Speaking Stata: Rowwise开始。
答案 1 :(得分:1)
根据罗伯托·费雷尔的回答,这似乎很容易产生一个循环:
gen uni_migrant = 0
qui forval j = 1/50 {
replace uni_migrant = uni_migrant + (edu_member`j' == 3) * (migr_member`j' == 1)
}
请注意,这不应该是
gen uni_migrant = 0
qui forval j = 1/50 {
replace uni_migrant = uni_migrant + (edu_member`j' == 3) if migr_member`j' == 1
}
因为与uni_migrant
条件不匹配的观察值的if
值只会设置为缺失。
另一种选择是
gen uni_migrant = 0
qui forval j = 1/50 {
replace uni_migrant = uni_migrant + cond(migr_member`j' == 1, (edu_member`j' == 3), 0)
}