我想创建新变量HHage
,这是HID报告的户主年龄。在数据集中,户主由P1
编码。数据集如下所示:
Personid HID Age
P1 100 12
P2 100 45
P1 101 16
P1 102 35
P2 102 24
P3 102 26
我尝试了egen
命令,但是我收到了与numlist有关的错误。我使用的命令是:
egen hhage = anyvalue(age), values(integer 1,2 to 26)
答案 0 :(得分:2)
// create the example data
clear
input ///
str2 Personid HID Age
P1 100 12
P2 100 45
P1 101 16
P1 102 35
P2 102 24
P3 102 26
end
// check whether there is only 1 household head per household
bys HID : gen byte flag = -(Personid == "P1")
bys HID (flag): replace flag = sum(flag)
assert flag == -1
drop flag
// create hhage
gen hhage = Age if Personid == "P1"
bys HID (hhage): replace hhage = sum(hhage)
list , sepby(HID)
答案 1 :(得分:2)
@Maarten Buis的优秀答案解释说,您可以在没有egen
的情况下执行此操作。这个答案侧重于使用egen
来解决这类问题。
允许作为 numlist 的内容是一个小问题;主要问题是egen
函数anyvalue()
没什么帮助。它的文档解释了
anyvalue(
varname ), values(
整数numlist )
可能无法与by
合并。如果 varname 等于提供的 numlist 中的任何整数值,则它采用 varname 的值,否则将丢失。
这将是合法的语法
egen hhage = anyvalue(age), values(1/26)
但是Stata会将1至26岁的年龄复制到新的变量而忽略其他变量,通过观察观察,无论是家庭还是谁是户主。那不是你想要的。
对此的一个egen
解决方案可能是
egen hhage = total(age * (Personid == "P1")), by(HHID)
表达式Personid == "P1"
在为true时计算结果为1,在为false时计算结果为0。因此,户主的age
出现在总数中,age
的其他值被忽略,因为它们对总数的贡献为0。
by()
选项未记录,但可以使用。 Stata鼓励你这样做:
bysort HHID : egen hhage = tota(age * (Personid == "P1"))
此解决方案假设
Personid
是一个字符串变量。如果它是一个数值变量,则表达式Personid == "P1"
应该被Personid == 1
替换为使用1或其他任何适当的整数代码。
每户有一户户主。这可以通过
之类的东西直接检查egen hhcount = total(Personid == "P1"), by(HHID)
另见http://www.stata-journal.com/article.html?article=dm0055有关该领域技术的评论。
请注意,原则上你可以使用
egen work = anyvalue(age) if Personid == "P1", values(0/200)
允许任何age
可以想象,只要该人是户主。然后你可以通过
egen hhage = total(work), by(HHID)
但是,我认为该解决方案没有意义。