楼主: 耕耘使者
1422 5

请高人帮忙修改完善程序 [推广有奖]

贵宾

学术权威

39%

还不是VIP/贵宾

-

威望
4
论坛币
1812817 个
通用积分
148.1096
学术水平
109 点
热心指数
173 点
信用等级
87 点
经验
93394 点
帖子
4550
精华
0
在线时间
2845 小时
注册时间
2006-4-6
最后登录
2024-5-8

1000论坛币
目的:绘制出按户主年龄分类的家庭户中曾生子女数和现居子女数
  数据: part.xls (33 KB)     指标解释: 指标解释.xls (40 KB)
程序:

libname (数据库所在路径)_;

options nofmterr;

ods listing exclude all;

odshtmlfile=输出表的路径及名称.xls;


/*计算个人年龄的过程*/

data basedata;

set (数据库名称) .sample                 /*取观测值并组合在一个数据集中*/

age=2010-R4_1;

if R4_2 ge11then age=age-1;                  /*计算年龄*/

run;

proc sort;                                  /*按照户编码排序*/

by H1;

run;


/*计算曾生子女数的过程*/

data one;                                   /*构造反映曾生子女数的cs、csm、csf的变量*/

set basedata(keep=R1 R2 R3 R26_1R26_2 H1);   /* R1为人代码;R2为与户主关系;R3为性别;R26_1为曾生男孩数;R26_2为曾生女孩数;H1为户代码*/  

if R2=0 and R3=2 then cs=R26_1+ R26_2       /*计算女性户主曾生男数*/

if R2=0 and R3=2 then csm=R26_1;              /*计算女性户主曾生男数*/

if R2=0 and R3=2 then csf=R26_2;               /*计算女性户主曾生女数*/

if R2=1 and R3=2 then cs=R26_1+ R26_2;        /*计算男性户主有配偶家庭曾生女数*/

if R2=1 and R3=2 then csm=R26_1;              /*计算男性户主有配偶家庭曾生男数*/

if R2=1 and R3=2 then csf=R26_2;               /*计算男性户主有配偶家庭曾生女数*/

proc sort;                                    /*按照户编码排序*/

by H1;

run;


/*计算现居子人数的过程*/

data one;

input xj xjm xjf @ @;

xj=0;

xjm=0;

xjf=0;

if R2=2 then xj=xj+1

if R2=2 and R3=1 then xjm=xjm+1

if R2=2 and R3=1 then xjf=xjf+1

by H1;

return

proc sort;                                    /*按照户编码排序*/

by H1;

Run;



data basedata csxj ;

merge basedata cs csm csf xj xjm xjf;

by H1;

group=substr(cx,1,2)+0;     /*构造城乡标志变量group(数值型)1为城镇,2为乡村*/

run;


procformat;

value $R24_fmt  ‘1’=’未婚’ ’2’=’有配偶’ ’3’=’离婚’  ’4’=’丧偶’ ’other’ = ‘缺失/不适用

value cs_fmt ‘0’=’未生育’ ‘1’=’曾生育1’ ’2’=’ 曾生育两人’ ’3’=’ 曾生育三人’  ’4’=’ 曾生育四人’  ’5’ = ‘曾生育五人’  ’6’ = ‘曾生育六人’  ’7’ = ‘曾生育七人’  ’other’ = ‘曾生育八人及以上

value csm_fmt ‘0’=’未生育男’ ‘1’=’曾生育1’ ’2’=’ 曾生育两男’ ’3’=’ 曾生育三男’  ’4’=’ 曾生育四男’  ’5’ = ‘曾生育五男’  ’6’ = ‘曾生育六男’  ’7’ = ‘曾生育七男’  ’other’ = ‘曾生育八男及以上

value csf_fmt ‘0’=’未生育女’ ‘1’=’曾生育1’ ’2’=’ 曾生育两女’ ’3’=’ 曾生育三女’  ’4’=’ 曾生育四女’  ’5’ = ‘曾生育五女’  ’6’ = ‘曾生育六女’  ’7’ = ‘曾生育七女’  ’other’ = ‘曾生育八女及以上

value xj_fmt ‘0’=’现居0’ ‘1’=’现居1’ ’2’=’ 现居两人’ ’3’=’ 现居三人’  ’4’=’ 现居四人’  ’5’ = ‘现居五人’  ’6’ = ‘现居六人’  ’7’ = ‘现居七人’  ’other’ = ‘现居八人及以上

value xjm_fmt ‘0’=’ 现居0’ ‘1’=’现居1’ ’2’=’ 现居两男’ ’3’=’ 现居三男’  ’4’=’ 现居四男’  ’5’ = ‘现居五男’  ’6’ = ‘现居六男’  ’7’ = ‘现居七男’  ’other’ = ‘现居八男及以上

value xjf_fmt ‘0’=’ 现居0’ ‘1’=’现居1’ ’2’=’ 现居两女’ ’3’=’ 现居三女’  ’4’=’ 现居四女’  ’5’ = ‘现居五女’  ’6’ = ‘现居六女’  ’7’ = ‘现居七女’  ’other’ = ‘现居八女及以上

run;



/*制作按户主年龄分类的家庭户曾生子女与现居子女状况列联表的宏程序*/

%macro tabulate(title,cx,gender);

title “&title. 按户主年龄分类的家庭户曾生子女与现居子女状况”;

data basedata_csxj1;

set basedata_ csxj;

if R2=0;

if group^=&cx;

if R3=&gender;

run;


proc tabulate;

class age cs csm csf xj xjm xjf R24;

table all age,(all R24 (all cs xj)  (all csm xjm)  (all csf xjf) ;

format R24 $ R24_fmt.  cs cs_fmt. csm csm_fmt.  csf csf_fmt. xj xj_fmt.  xjm xjm_fmt. xjf xjf_fmt.;

keylabel all=’总计

label R24=”婚姻状况”  age=”年龄

run;


%mend tabulate;

% tabulate(全国男性,0,1)

% tabulate(全国女性,0,2)

% tabulate(城镇男性,2,1)

% tabulate(城镇女性,2,2)

% tabulate(乡村男性,1,1)

% tabulate(乡村女性,1,2)

odshtml close;

ods listing exclude none;




最佳答案

tj0412ymy 查看完整内容

这段程序修改起来真费事!LZ测试一下修改后的程序,应该问题不大。
关键词:Tabulate listing libname options format 编程
沙发
tj0412ymy 发表于 2012-6-8 21:30:42 |只看作者 |坛友微信交流群
这段程序修改起来真费事!LZ测试一下修改后的程序,应该问题不大。
  1. libname test "D:\";

  2. options nofmterr;
  3. ods listing exclude all;
  4. ods html file="D:\result.xls";

  5. /*计算个人年龄的过程*/
  6. data basedata;
  7. set test.sample;                /*取观测值并组合在一个数据集中*/
  8. age=2010-R4_1;
  9. if R4_2 ge 11 then age=age-1;                  /*计算年龄*/
  10. run;

  11. proc sort data=basedata;                                  /*按照户编码排序*/
  12. by H1;
  13. run;

  14. /*计算曾生子女数的过程*/
  15. data one;                                   /*构造反映曾生子女数的cs、csm、csf的变量*/
  16. set basedata(keep=R1 R2 R3 R26_1 R26_2 H1);   /* R1为人代码;R2为与户主关系;R3为性别;R26_1为曾生男孩数;R26_2为曾生女孩数;H1为户代码*/  
  17. if R2=0 and R3=2 then cs=R26_1+ R26_2;       /*计算女性户主曾生男数*/
  18. if R2=0 and R3=2 then csm=R26_1;              /*计算女性户主曾生男数*/
  19. if R2=0 and R3=2 then csf=R26_2;               /*计算女性户主曾生女数*/
  20. if R2=1 and R3=2 then cs=R26_1+ R26_2;        /*计算男性户主有配偶家庭曾生女数*/
  21. if R2=1 and R3=2 then csm=R26_1;              /*计算男性户主有配偶家庭曾生男数*/
  22. if R2=1 and R3=2 then csf=R26_2;               /*计算男性户主有配偶家庭曾生女数*/
  23. run;

  24. proc sort data=one;                                    /*按照户编码排序*/
  25. by H1;
  26. run;

  27. /*计算现居子人数的过程*/
  28. data one;
  29. set one;
  30. xj=0;
  31. xjm=0;
  32. xjf=0;
  33. if R2=2 then xj=xj+1;
  34. if R2=2 and R3=1 then xjm=xjm+1;
  35. if R2=2 and R3=1 then xjf=xjf+1;
  36. run;

  37. proc sort data=one;                                    /*按照户编码排序*/
  38. by H1;
  39. Run;

  40. data basedata_csxj ;
  41. merge basedata one;
  42. by H1;
  43. group=substr(cx,1,1);     /*构造城乡标志变量group(数值型),1为城镇,2为乡村*/
  44. run;

  45. proc format;
  46. value $R24_fmt  '1'='未婚' '2'='有配偶' '3'='离婚'  '4'='丧偶' 'other' = '缺失/不适用';
  47. value cs_fmt 0='未生育' 1='曾生育1人' 2=' 曾生育两人' 3=' 曾生育三人'  4=' 曾生育四人'  5 = '曾生育五人'  6 = '曾生育六人'  7 = '曾生育七人'  other = '曾生育八人及以上';
  48. value csm_fmt 0='未生育男' 1='曾生育1男' 2=' 曾生育两男' 3=' 曾生育三男'  4=' 曾生育四男'  5 = '曾生育五男'  6 = '曾生育六男'  7 = '曾生育七男'  other = '曾生育八男及以上';
  49. value csf_fmt 0='未生育女' 1='曾生育1女' 2=' 曾生育两女' 3=' 曾生育三女'  4=' 曾生育四女'  5 = '曾生育五女'  6 = '曾生育六女'  7 = '曾生育七女'  other = '曾生育八女及以上';
  50. value xj_fmt 0='现居0人' 1='现居1人' 2=' 现居两人' 3=' 现居三人'  4=' 现居四人'  5 = '现居五人'  6 = '现居六人'  7 = '现居七人'  other = '现居八人及以上';
  51. value xjm_fmt 0=' 现居0男' 1='现居1男' 2=' 现居两男' 3=' 现居三男'  4=' 现居四男'  5 = '现居五男'  6 = '现居六男'  7 = '现居七男'  other = '现居八男及以上';
  52. value xjf_fmt 0=' 现居0女' 1='现居1女' 2=' 现居两女' 3=' 现居三女'  4=' 现居四女'  5 = '现居五女'  6 = '现居六女'  7 = '现居七女'  other = '现居八女及以上';
  53. run;

  54. /*制作按户主年龄分类的家庭户曾生子女与现居子女状况列联表的宏程序*/

  55. %macro tabulate(title,cx,gender);
  56. title "&title. 按户主年龄分类的家庭户曾生子女与现居子女状况";

  57. data basedata_csxj1;
  58. set basedata_csxj;
  59. if R2=0;
  60. if group^=&cx.;
  61. if R3=&gender.;
  62. run;

  63. proc tabulate data=basedata_csxj1;
  64. class age cs csm csf xj xjm xjf R24;
  65. table all age, (all R24) (all cs xj)  (all csm xjm)  (all csf xjf) ;
  66. format R24 $R24_fmt.  cs cs_fmt. csm csm_fmt.  csf csf_fmt. xj xj_fmt.  xjm xjm_fmt. xjf xjf_fmt.;
  67. keylabel all='总计';
  68. label R24="婚姻状况"  age="年龄";
  69. run;
  70. %mend tabulate;

  71. %tabulate(全国男性,0,1);
  72. %tabulate(全国女性,0,2);
  73. %tabulate(城镇男性,2,1);
  74. %tabulate(城镇女性,2,2);
  75. %tabulate(乡村男性,1,1);
  76. %tabulate(乡村女性,1,2);

  77. ods html close;
  78. ods listing exclude none;
复制代码
已有 2 人评分学术水平 热心指数 信用等级 收起 理由
jingju11 + 5 + 5 + 5 热心帮助其他会员
耕耘使者 + 1 + 1 + 1 热心帮助其他会员

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

对SAS和统计方面感兴趣的朋友,请加SAS学习和认证讨论群:169157207。欢迎在群上讨论!

使用道具

藤椅
耕耘使者 发表于 2012-6-9 21:48:23 |只看作者 |坛友微信交流群
tj0412ymy 发表于 2012-6-8 23:29
这段程序修改起来真费事!LZ测试一下修改后的程序,应该问题不大。
朋友请看一下第一部分程序的运行结果,出了什么问题?
TT截图未命名.bmp

使用道具

板凳
tj0412ymy 发表于 2012-6-9 23:49:44 |只看作者 |坛友微信交流群
耕耘使者 发表于 2012-6-9 21:48
朋友请看一下第一部分程序的运行结果,出了什么问题?
Pls try this method. http://support.sas.com/kb/10/199.html
1. Make the Enhanced Editor the active window.
2. Click on Tools->Options->Enhanced Editor.
3. Check the box beside 'Replace tabs with spaces on file open'.
4. Click OK to close the dialog box.
已有 1 人评分热心指数 信用等级 收起 理由
耕耘使者 + 1 + 1 热心帮助其他会员

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

对SAS和统计方面感兴趣的朋友,请加SAS学习和认证讨论群:169157207。欢迎在群上讨论!

使用道具

报纸
耕耘使者 发表于 2012-6-10 19:36:40 |只看作者 |坛友微信交流群
正在测试、学习中,稍候。
非常感谢朋友!

使用道具

地板
耕耘使者 发表于 2012-6-11 06:42:06 |只看作者 |坛友微信交流群
tj0412ymy 发表于 2012-6-8 21:30
这段程序修改起来真费事!LZ测试一下修改后的程序,应该问题不大。
非常感谢!

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-21 13:16