我有一个很大的数据集,其中每个观察都代表一个家庭;变量要么是家庭特征(地点、姓氏),要么是家庭成员的特征,例如age_member1, age_member2, edu_member1, edu_member2和更多的特征,对于50名成员。
我想用任何数字来找出移民和非移民之间的差异,例如教育水平是否不同(3 =大学)。这段代码显示了家里有多少人拥有大学学位:
egen uni_member = anycount (edu_member*), values(3)现在我只想计算那些移民,也许有一个条件:
egen uni_migrant = anycount (edu_member*) if migr_member*=1, values(3)但这是错误的,因为if必须引用单个变量.有什么帮助吗?
发布于 2014-07-01 13:43:03
按照罗伯托·费雷尔的回答,这似乎很容易就会变成一个循环:
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)
} 发布于 2014-07-01 13:28:17
我建议使用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。
如果你坚持逐行工作,你可以从尼克·考克斯的施塔塔:罗伊斯开始。
https://stackoverflow.com/questions/24509622
复制相似问题