如何使用egen中的每个变量anycount

时间:2014-07-01 11:52:37

标签: if-statement stata

我有一个大型数据集,每个观察代表一个家庭;变量是家庭特征(地点,姓氏)或家庭成员的特征,例如家庭成员。 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必须引用单个变量......任何帮助?

2 个答案:

答案 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)
}