%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:) -->