If statement 如何对egen anycount中的每个变量使用if

If statement 如何对egen anycount中的每个变量使用if,if-statement,stata,If Statement,Stata,我有一个大的数据集,每个观察代表一个家庭;变量为住户特征(位置、姓氏)或住户成员特征,例如50名成员的年龄成员1、年龄成员2、教育成员1、教育成员2等 我想使用任何计数来找出移民和非移民之间的差异,例如教育水平是否不同(3=大学)。此代码用于确定家庭中有多少人拥有大学学位: egen uni_member = anycount (edu_member*), values(3) 现在我只想统计那些移民,可能有if条件: egen uni_migrant = anycount (edu_membe

我有一个大的数据集,每个观察代表一个家庭;变量为住户特征(位置、姓氏)或住户成员特征,例如50名成员的
年龄成员1、年龄成员2、教育成员1、教育成员2等

我想使用任何计数来找出移民和非移民之间的差异,例如教育水平是否不同(3=大学)。此代码用于确定家庭中有多少人拥有大学学位:

egen uni_member = anycount (edu_member*), values(3)
现在我只想统计那些移民,可能有if条件:

egen uni_migrant = anycount (edu_member*) if migr_member*=1, values(3)

但这是错误的,因为if必须引用单个变量。。。有什么帮助吗?

我建议使用
重塑
将数据放入
长格式。按顺序工作是可能的,但我通常觉得更麻烦。例如:

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号家庭有一名成员同时是移民并受过大学教育。如果需要,您可以将
重塑
格式。请参见帮助重塑


如果你坚持按顺序工作,你可以从Nick Cox的文章开始。

下面是Roberto Ferrer的答案,这似乎很容易让人陷入循环:

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 
} 
对于与
if
条件不匹配的观察值,将仅将
uni_
的值设置为缺失

另一种选择是

gen uni_migrant = 0 
qui forval j = 1/50 { 
    replace uni_migrant = uni_migrant + cond(migr_member`j' == 1, (edu_member`j' == 3), 0)
} 

最后我使用了上一个版本,只是做了一个小小的改动:替换uni_migram=uni_migram+cond(migr_member
j'==1,1,0)*cond(edu member
j'==3,1,0)@Nick,如果不是
cond(migr_member'j'==1,(edu member'j'==3),0)
,第三个选项?@Roberto ferer很好。