SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 617|回复: 5
打印 上一主题 下一主题

对某一字段的观测值控制

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2011-5-4 18:44:43 | 只看该作者

对某一字段的观测值控制

对 year 字段想达到以下的效果:
year
2011~2031
2031~2051
2051~2071
2071~2091
....
自己简单编了下面一小段程序想来实现它,不过想来是对它的机制还不太了解,程序是错的!
[code:2d2onv35]data a;
%let start=2011;
%let end=%eval(&start.+20);
do i=1 to 5;
   year="&start.~&end.";
   %let start=%eval(&start.+20);
   output;
end;
run;[/code:2d2onv35]
请求赐教!!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2011-5-4 20:07:02 | 只看该作者

Re: 对某一字段的观测值控制

???
[code:3hi0pmrg]%macro a;
    %let start=2011;
    %let increment=20;
    data a;
    %do i=0 %to 4;
        year="%eval(&start+&i*&increment)~%eval(&start+(&i+1)*&increment)";
        output;
    %end;
    run;
%mend a;
%a

%let start=2011;
%let increment=20;
data b(keep=year);
    do i=0 to 4;
       year=catx('~',&start+i*&increment,&start+(i+1)*&increment);
       output;
    end;
run;

data c(keep=year);
    length year $20;
    year='2011';
    increment=20;
    do i=1 to 5;
        year=scan(year,-1,'~');
        year=catx('~',year,input(year,8.)+increment);
        output;
    end;
run;[/code:3hi0pmrg]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2011-5-4 20:22:56 | 只看该作者

Re: 对某一字段的观测值控制

thanks hopewell!!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2011-5-5 23:14:22 | 只看该作者

Re: 对某一字段的观测值控制

前提:假设2011年,地球上只有三队青年夫妇了,也就是要求对这三对青年夫妇进行人口模拟!
而当人口基数比较小的时候,需要按代来进行模拟(按20年为一代来计),所以刚开始的 year 年份字段
被压缩成大小为20年的区间为一条观测,而当基数大的时候每一条观测需要按一年来计!
所以 year 字段需要达到的效果又要变成类似下面的这样了:
2011~2031
2031~2051
2051~2071
2071~2091
2092
2093
...
把前面一段代码进行简单修改后,想来达到此效果,不过还是有误!测试就清楚了!代码如下:
[code:2xrd1s1m]libname b'F:\';
options Mprint Mlogic Mstored sasmstore=b;
%macro b(n=,M=)/STORE;
    %let start=2011;
    %let increment=20;
    data b;
    %do i=1 %to &n.;
        year="%eval(&start+(&i.-1)*&increment) ~ %eval(&start+&i.*&increment)";
        output;
    %end;
    run;
        data b;
        label year='年份';
          set b;
          ii+1;
        run;
        data c;
      label year='年份';
      %let r=%eval(&start+&n.*&increment.);
      year=%str(&r);
          %do i=&n.+1 %to &M.;
        year=%str(%eval(&i.-&n.+&r.));
                ii+1;
                output;
         %end;
    run;
    proc append base=b data=c force;run;
%mend b;
%let n=20;
%let M=120;
%b(n=&n,M=&M)[/code:2xrd1s1m]
其中代码中的 n 代表区间观测的个数!M 代表总的观测数。 请教!!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2011-5-6 20:22:59 | 只看该作者

Re: 对某一字段的观测值控制

[code:sncf2sth]%let start =2011; %let increment =20;
%let n =20; %let m =120;
data have(keep =year);
        do _i =&start. by 1 until(_m =&m.);
                _x ++1;
                if _x <=&increment.*&n. then do;
                        if  mod(_x, &increment.) ^=1 then continue;
                        year =catx('~', _i, _i +&increment.);         
                end;
                else year =cats(_i +1);       
                _m ++1; output;
        end;
run;[/code:sncf2sth]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2011-5-6 20:59:38 | 只看该作者

Re: 对某一字段的观测值控制

thanks to thanks,to jingju11 !!  跟大师学习!! <!-- s:) --><img src="{SMILIES_PATH}/icon_smile.gif" alt=":)" title="Smile" /><!-- s:) -->
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2025-6-10 09:39 , Processed in 0.100164 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表