楼主: eatea
11641 34

[原创博文] SAS分组程序 [推广有奖]

11
pl172231 发表于 2012-5-10 17:23:17
group by a。h1 语句很重要,记得之前说的那些最小值最大值吗,最小最大是在哪个范围比较呢?是按照group by a。h1分组后,每个小组中的相应计算结果的最小值最大值

12
pl172231 发表于 2012-5-10 17:24:59
order by 语句是排序语句,就是让您可以看到以order by后面变量从小到大排的结果,即把结果有序输出

13
pl172231 发表于 2012-5-10 17:43:45
给您写程序的是个高手,用了很多高级方法
data merge1;

        set merge;

        by h1;

        if first.h1;

run;
这个语句应该不会陌生,可能您不理解by语句和if语句,是这样的,您刚刚是不是得到了一个叫merge的数据集啊,merge数据集里存放着每个户主的信息加每个户主对应孩子的信息,注意如果户主有不止一个孩子,则将每个孩子和户主都生成一个记录,如 毛爸爸——大毛 一个,毛爸爸——小毛 一个 等等 加在这个家庭中生下长子时毛爸爸的年龄,生下小子时毛爸爸的年龄,加最小孩子的出生日期,注意到merge表中,毛爸爸——大毛这条信息,与毛爸爸——小毛 这个信息,除了大毛和小毛处不同其它地方都一样,by if语句就是达到,只在毛爸爸——大毛 毛爸爸——小毛中取一条记录的目的

14
pl172231 发表于 2012-5-10 17:51:57
到这里总结一下,现在merge1数据集中存放有什么?是不是有每家一个家庭编号,一家不落,一家不重,对应每家的家庭编号有这家第一个孩子出生时户主年龄,即age1,最后一个孩子出生时户主年龄 age2,最小孩子的生日即age3啊?其他的内容都不用管了,我们有这些就够了不是吗?

15
pl172231 发表于 2012-5-10 17:59:31
44.proc sql;

45.        create table final as

46.        select a.*, count(a.age1) as n1

47.        from merge1 as a

48.        group by age1;
这个语句我不会这么写哦,会给您一些冗余的数据,相信您现在已经有一些懂了,看看group by语句,是不是要按age1分组啊?这个分组的过程您是看不到的,计算机内部把数据按照age1的不同分成了若干组,age1是什么?是不是长子出生时户主的年龄啊?分组之后干什么?哦,是用count函数求每组有几个记录啊,有几个记录是不是就有几家啊,是不是求出不同age1有几家啊,以此类推,以您的智商肯定懂

16
pl172231 发表于 2012-5-10 18:02:56
因为这个程序比较复杂,我尽力为您讲解,但肯定有一些没讲好的地方,您要注意比对着我的讲解,和每部生成的数据集看,去体会,如果有没有理解的地方,我会再详细和您说的,您给我发信即可,我有时间就回您

17
pl172231 发表于 2012-5-10 18:25:06
我也不想要您的钱,交个朋友,要那么多钱没用

18
eatea 在职认证  发表于 2012-5-10 19:39:49
pl172231 发表于 2012-5-10 16:59
proc sql;

        create table merge as
谢谢您讲解了这么多。
还有一个问题就是,在得到年龄差时,使用两个人的出生年份相减。如果算年龄差时考虑每个人出生月份。例如,一个人是1968年11月出生,另一个是1989年5月出生,则年龄差为1989-1968-1,怎样修改下程序max(b.r4_1-a.r4_1)呢?

19
eatea 在职认证  发表于 2012-5-10 19:43:33
pl172231 发表于 2012-5-10 18:02
因为这个程序比较复杂,我尽力为您讲解,但肯定有一些没讲好的地方,您要注意比对着我的讲解,和每部生成的 ...
看完您的讲解了,非常详细,完全明白了,谢谢!

20
pl172231 发表于 2012-5-10 21:34:26
eatea 发表于 2012-5-10 19:39
谢谢您讲解了这么多。
还有一个问题就是,在得到年龄差时,使用两个人的出生年份相减。如果算年龄差时考 ...
请将出生日期由字符型改为时间日期型数据,使用mdy()函数,请上网查,然后使用yrdif()函数,请上网查,很容易

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-2 03:19