gen与egen,傻傻分不清楚?( 二 )


gen与egen,傻傻分不清楚?


 
(3)生成AgeRank变量:以家庭为单位,对家庭成员按年龄升序排序;生成hsize变量:计算每个家庭的人口数 。
*使用gen生成:
bysort hid (age): gen AgeRankg = _n //使用bysort对hid分组并排序,(age)表示age不参与分组,仅参与家庭内部的排序 。bysort hid: gen hsizeg = _N
运行结果如下图所示,第一个家庭为3人,第二个家庭为6人 。
gen与egen,傻傻分不清楚?


 
*使用egen生成:
bysort hid (age): egen AgeRanke = _nbysort hid :egen hsizee = _N
运行出错,表明egen无法使用_n和_N 。
gen与egen,傻傻分不清楚?


 
(4)生成mean变量:计算每个家庭的平均年龄 。
*使用gen创建新变量:
bysort hid: gen meang = mean(age)
运行出错,表示gen无法使用egen专属函数 。
gen与egen,傻傻分不清楚?


 
*使用egen创建新变量:
bysort hid: egen meane = mean(age)
运行结果如图所示,这表明egen的一些函数可以搭配by前缀使用 。
gen与egen,傻傻分不清楚?


 
(5)生成IncomeSum变量:计算两个家庭的总收入 。
gen IncomeSumg = sum(income)egen IncomeSume = sum(income)
运行结果如下图所示 。
gen与egen,傻傻分不清楚?


 
特别地,目前仅发现sum()函数能够同时被gen和egen使用 。利用gen命令,使用sum()函数生成的IncomeSumg是列累积和,比如IncomeSumg[2]=income[1]+ income[2],是一个变动值(running value),而在egen命令下sum()返回的则是列总和,IncomeSume的每一个变量值都等于income变量值的总和(即44000=5000+8000+9000+0+4000+8000+6000+2000+2000),是一个常数(constant) 。
实际上,sum()作为一个常规数学函数,并不属于egen专属函数,并且egen专属函数中的total()函数功能与sum()完全一致——返回列总和 。这个矛盾我们目前尚无答案,读者朋友们如有合理的想法请在评论区告诉我们唷~4.结论
综合上述分析,我们能够得到启示:使用gen命令创建新变量是一种“相对”创建,比如,现要求生成一个新变量,个人年收入incomey:
gen incomey = income*1
这个命令的实质是,创建一个新变量incomey,使得:
incomey[1] = income[1]*12incomey[2] = imcome[2]*12…incomey[_N] = income[_N]*12
而egen的某些专属函数的参数往往是某一整行或某一整列,比如计算两个家庭的月收入均值,月收入的下四分位数:
egen meani = mean(income)egen pctile4 = pctile(income),p(25)
其中,income是作为收入总和(即44000)参与计算的,这与gen命令有显著的不同 。
当然,egen还有许多其他专属函数,比如anycount()、anymatch()等使用“相对”创建方法的专属函数,也有rowfirst()、rowmax()等对每行进行匹配和判断的函数……总之,当你想创建一个以整行或整列的特征为结果或判断、匹配条件时就可以考虑使用egen命令啦 。

猜你喜欢