Stata有关排序与分组

博客围绕家庭成员数据 family.dta 展开,任务包括生成表示家庭成员数量的新变量 hhsize、给成员编码 id、按家庭生成全家成员平均年龄值 mage,以及按年龄排序生成成员代码 nid。详细解析了实现这些任务的命令及原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

初始数据

input hhid age
hhid age
1 86
1 42
1 36
1 57
1 28
2 42
2 5
2 40
end
save family, replace

任务要求

要求
下列数据为家庭成员数据 family.dta,其中 hhid 为家庭编码, age 为家
庭成员的年龄。
1、生成一个新变量 hhsize,该变量表示共有多少个家庭成员。
2、给每个家庭成员一个编码 id。如第一个家庭的第一个成员编码为11 ;
3、按家庭生成一个全家成员平均年龄值 mage。
4、对每个家庭,分别按年龄大小排序,然后生成一个家庭成员代码,即
家庭内年龄最小的成员代码为 1 ,年龄最大的家庭成员,代码为 nid。

分析

由题意可知,布置的任务都围绕着家庭产生,而家庭在list里面就是变量hhid的不同,
就相当于是根据分组变量hhid来将该list进行各种分组排序增添新变量的操作。

命令

1、bys hhid:egen hhsize = count(hhid)

完成: 生成一个新变量 hhsize,该变量表示共有多少个家庭成员。

根据家庭编号来分组,而分组的操作需要用到命令bysort ——>(bys),
bys 后面跟的变量为分组变量 也就是说 这个分组变量值相同的实例为一组,
因此 bys hhid就已经将该list分好组了,接下开我们只需要算这个组里面由哪些成员并赋给一个新的变量hhsize即可
bys hhid: 注意: 当你在“:”后面所编写的命令 就已经是根据分组的子集合来进行的操作也可以说成子list。
注: 我看到老师ppt上教的命令是 by hhid, sort:这个命令跟bys hhid:(bysort hhid:)功能是一样的。
egen 和 gen 都用于生成新变量,但egen 的特点是它更强大的函数功能。 gen 可以支持一些函数, egen 支持额外的函数。如果用 gen 搞不定,就得用egen想办法了。
很显然因为gen没有count()方法,所以我用了egent
count()这个方法顾名思义求和,由于我们已经分好组了所以这个count(hhid)所求的hhid变量个数就是这个组里面的hhid变量个数及家庭成员个数。

2、bys hhid : gen id = hhid*10+_n

完成: 给每个家庭成员一个编码 id。如第一个家庭的第一个成员编码为11 ;

这个command的前面bys hhid: 不必再赘述,懂得都懂了,这里后面的命令要用gen 毕竟是生成变量,但是!为什么不能用egen呢,上面我也说了,egen所覆盖的函数比gen更广,但这里用不了egen,我也不知道,等我百度百度再说,或者你可以上课问问老师,(问老师比较好)。

在这里插入图片描述

由题可知,我们生成的这几个变量都是数值型变量可以进行加减乘除操作,而根据第二题的要求,十位数为hhid,个位数递增的要求,hhid*10+_n就是我们所需要的id值,_n就是数值从1开始递增,毕竟分组不同,所以当这一组操作结束完之后,下一组_n依然是从1开始递增。

3、bys hhid:egen mage = mean(age)

完成: 按家庭生成一个全家成员平均年龄值 mage。

相信看到这里 应该对上面的command不陌生了,mean()函数也是顾名思义,总年龄÷家庭成员数量

4、. sort hhid age

. bys hhid : gen nid = _n

完成: 对每个家庭,分别按年龄大小排序,然后生成一个家庭成员代码,即家庭内年龄最小的成员代码为 1 ,年龄最大的家庭成员,代码为 nid。。

先排序再赋值,仅此而已
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值