SAS中文论坛

标题: 对某一字段的观测值控制 [打印本页]

作者: shiyiming    时间: 2011-5-4 18:44
标题: 对某一字段的观测值控制
对 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]
请求赐教!!
作者: shiyiming    时间: 2011-5-4 20:07
标题: 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]
作者: shiyiming    时间: 2011-5-4 20:22
标题: Re: 对某一字段的观测值控制
thanks hopewell!!
作者: shiyiming    时间: 2011-5-5 23:14
标题: 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 代表总的观测数。 请教!!
作者: shiyiming    时间: 2011-5-6 20:22
标题: 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]
作者: shiyiming    时间: 2011-5-6 20:59
标题: Re: 对某一字段的观测值控制
thanks to thanks,to jingju11 !!  跟大师学习!! <!-- s:) --><img src="{SMILIES_PATH}/icon_smile.gif" alt=":)" title="Smile" /><!-- s:) -->




欢迎光临 SAS中文论坛 (http://mysas.net/forum/) Powered by Discuz! X3.2