楼主: eatea
11644 34

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

  • 2关注
  • 32粉丝

已卖:609份资源

副教授

98%

还不是VIP/贵宾

-

威望
1
论坛币
41596 个
通用积分
17.6379
学术水平
31 点
热心指数
28 点
信用等级
30 点
经验
49683 点
帖子
1030
精华
1
在线时间
150 小时
注册时间
2009-8-5
最后登录
2025-11-7

楼主
eatea 在职认证  发表于 2012-5-9 23:49:08 |AI写论文
500论坛币
下图是部分人口普查数据,R2=0表示户主、R2=2表示子女,R4_1表示年龄,H1表示家庭户编号。
希望用SAS编程,输出第一个孩子出生时按户主年龄分组的家庭户数、最后一个孩子出生时按户主年龄分组的家庭户数、按最小孩子年龄分的家庭户数。附件的EXCEL文件中也包含下表的数据。




12345.jpg

最佳答案

denver 查看完整内容

如果没有理解错的话,n1-n3是你想要的结果。 钱就算了,我也是学习累了休息一下的,还可以顺便做个小练习,如果符合你的要求,给个评分就好了。
关键词:EXCEL SAS编程 孩子出生 最后一个 xcel 人口普查 孩子出生 小孩子 EXCEL 程序

本帖被以下文库推荐

沙发
denver 发表于 2012-5-9 23:49:09
如果没有理解错的话,n1-n3是你想要的结果。
钱就算了,我也是学习累了休息一下的,还可以顺便做个小练习,如果符合你的要求,给个评分就好了。
  1. data aaa;
  2.         input h2 r2 r4_1 h1 $;
  3.         cards;
  4. 1        0        1933        011100
  5. 1        2        1989        011101
  6. 1        0        1968        011101
  7. 1        2        1993        011101
  8. 1        2        1991        011101
  9. 1        2        1981        011102
  10. 1        2        1986        011102
  11. 1        0        1958        011102
  12. 1        2        1971        011103
  13. 1        0        1948        011103
  14. 1        0        1947        011104
  15. 1        0        1949        011105
  16. 1        2        1976        011105
  17. 1        2        1980        011105
  18. ;
  19. run;

  20. proc sort data=aaa; by h1 r2 r4_1;run;

  21. data parent children;
  22.         set aaa;
  23.         if r2=0 then output parent;
  24.         if r2=2 then output children;
  25. run;

  26. proc sql;
  27.         create table merge as
  28.         select a.*, b.*,min(b.r4_1-a.r4_1) as age1, max(b.r4_1-a.r4_1) as age2, max(b.r4_1) as age3
  29.         from parent as a left join children as b
  30.         on a.h1=b.h1
  31.         group by a.h1
  32.         order by a.h1;
  33. quit;

  34. data merge1;
  35.         set merge;
  36.         by h1;
  37.         if first.h1;
  38. run;

  39. proc sql;
  40.         create table final as
  41.         select a.*, count(a.age1) as n1
  42.         from merge1 as a
  43.         group by age1;

  44.         create table final as
  45.         select a.*, count(a.age2) as n2
  46.         from final as a
  47.         group by age2;

  48.         create table final as
  49.         select a.*, count(a.age3) as n3
  50.         from final as a
  51.         group by age3;
  52. quit;
复制代码
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
eatea + 1 + 1 + 1 好的意见建议

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

Denver大家一起读Paper系列索引贴:
https://bbs.pinggu.org/thread-1430892-1-1.html

藤椅
pl172231 发表于 2012-5-10 09:16:02
楼上的代码可以,如果您有不明白的地方,我可以详细的跟您说
已有 1 人评分热心指数 信用等级 收起 理由
eatea + 1 + 1 热心帮助其他会员

总评分: 热心指数 + 1  信用等级 + 1   查看全部评分

板凳
eatea 在职认证  发表于 2012-5-10 12:49:19
pl172231 发表于 2012-5-10 09:16
楼上的代码可以,如果您有不明白的地方,我可以详细的跟您说
帮我解释下下面几句程序的意思吧。谢谢!

proc sort data=aaa; by h1 r2 r4_1;run;

proc sql;

        create table merge as

        select a.*, b.*,min(b.r4_1-a.r4_1) as age1, max(b.r4_1-a.r4_1) as age2, max(b.r4_1) as age3

        from parent as a left join children as b

        on a.h1=b.h1

        group by a.h1

        order by a.h1;

quit;



data merge1;

        set merge;

        by h1;

        if first.h1;

run;



proc sql;

        create table final as

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

        from merge1 as a

        group by age1;


报纸
eatea 在职认证  发表于 2012-5-10 12:53:10
denver 发表于 2012-5-10 00:48
如果没有理解错的话,n1-n3是你想要的结果。
钱就算了,我也是学习累了休息一下的,还可以顺便做个小练习, ...
谢谢您的解答!论坛币我已经支付出去了,如果您的答案合适,我会设置为最佳答案的(我大致看了下好像符合我的要求)。
可以帮我解释下下面几句程序的意思吗?

proc sort data=aaa; by h1 r2 r4_1;run;

proc sql;

        create table merge as

        select a.*, b.*,min(b.r4_1-a.r4_1) as age1, max(b.r4_1-a.r4_1) as age2, max(b.r4_1) as age3

        from parent as a left join children as b

        on a.h1=b.h1

        group by a.h1

        order by a.h1;

quit;



data merge1;

        set merge;

        by h1;

        if first.h1;

run;



proc sql;

        create table final as

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

        from merge1 as a

        group by age1;


地板
pl172231 发表于 2012-5-10 16:41:50
proc sort data=aaa; by h1 r2 r4_1;run;
这是排序程序,意思是对aaa这个数据集的内容进行排序,怎么排?by语句指定,先按h1排,h1一样的再按r2排r2一样的再按r4—1排
已有 1 人评分经验 学术水平 热心指数 信用等级 收起 理由
eatea + 100 + 3 + 3 + 3 分析的有道理

总评分: 经验 + 100  学术水平 + 3  热心指数 + 3  信用等级 + 3   查看全部评分

7
pl172231 发表于 2012-5-10 16:59:36
proc sql;

        create table merge as

        select a.*, b.*,min(b.r4_1-a.r4_1) as age1, max(b.r4_1-a.r4_1) as age2, max(b.r4_1) as age3

        from parent as a left join children as b

        on a.h1=b.h1

        group by a.h1

        order by a.h1;

quit;

这个程序比较复杂,要慢慢讲解,这是一个数据库的结构化查询语言,create table merge 这句是说让建立一个数据集,名字叫merge,那么这个merge数据集里有什么内容呢?(您可能觉得奇怪,您并没有看到a和b这两个数据集,原来a和b这两个名字是通过parent as a left join children as b语句为parent和children这两个数据集取的”别名“as语句跟着指定的别名)select a.*, b.*,min(b.r4_1-a.r4_1) as age1, max(b.r4_1-a.r4_1) as age2, max(b.r4_1) as age3这句话指定了数据集里存放的内容,数据集里放着a这个数据集中的所有变量(*表示所有),b这个数据集中得所有变量,以及在按照group by a。h1分成小组时即按照家庭编号a。h1分组时,每组中b。r4—1减去a。r4—1所得值的最小值min(b.r4_1-a.r4_1),以及相应的max(b.r4_1-a.r4_1)最大值,b这个数据集中r4—1的最大值max(b.r4_1)
已有 2 人评分学术水平 热心指数 信用等级 收起 理由
denver + 1 + 1 + 1 比我讲的好
webgu + 1 + 1 + 1 相当有耐心

总评分: 学术水平 + 2  热心指数 + 2  信用等级 + 2   查看全部评分

8
pl172231 发表于 2012-5-10 17:01:50
注意上面的几个变量取了别名,age1 age2 age3 您的智商一定会注意到as语句对不对?

9
pl172231 发表于 2012-5-10 17:17:51
from parent as a left join children as b

        on a.h1=b.h1
我们接着讲,上面这个语句时刚刚那么多语句后面的一部分,他告诉select语句,从哪里找上面select语句指定的内容,从哪里找呢?从parent数据集与children数据集的left join结果中找,什么叫left join?所谓左连接就是先将两张表中的所有观测取“笛卡尔积”,再按照取笛卡尔积之后的结果来筛选,只有 a.h1=b.h1 的观测才能被留在新形成的笛卡尔积表中,那么’左‘字怎么体现?左字体现在要把左边那张表中每条记录都保存,如果能有符合a.h1=b.h1的就保存合并的记录,如果没有就单独保存下来

10
pl172231 发表于 2012-5-10 17:20:02
您可能会问什么叫笛卡尔积,定义:
设A,B为集合,用A中元素为第一元素,B中元素为第二元素构成的有序对,所有这样的有序对组成的集合   叫做A与B的笛卡尔积,记作AxB.   笛卡尔积的符号化为:   AxB={<x,y>|x∈A∧y∈B}   例如,A={a,b},B={0,1,2},则   AxB={<a,o>,<a,1>,<a,2>,<b,0>,<b,1>,<b,2>,}   BxA={<0,a>,<0,b>,<1,a>,<1,b>,<2,a>,<2,b>}   笛卡尔积的运算性质

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

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