谢谢tanzhen_mysas的提醒,忘了nobs这个选项了
[code:1prwxruk]%macro group(inds,outds,group);
data &outds(drop=interval);
retain interval;
set &inds nobs=nobs;
if _n_=1 then interval=round(nobs/&group);
group=int((_n_-1)/interval)+1;
run;
%mend;
data tgt;
intl=10;
if int(nobs/intl) =nobs/intl then len=nobs/intl;
else len=int((nobs-1)/intl)+1;
set tmp end=eof nobs=nobs;
retain tgt 0 seq 1 i 0;
tgt=sum(tgt,row);
i+1;
if _N_>1 then do;
if mod(_N_-1,len)=0 then do;
tgt=row;
i=1;
seq=seq+1;
end;
end;
run;
[code:1ktf8g2j]data new; do x=1 to 23; output; end; run;
data new1;
do group=1 to 10;
nGrp =ceil((nobs-n)/(11-group));
do k =1 to nGrp;
n +1; output;
end;
end;
set new nobs =nobs;
run;
data xx; merge new1 new; run;
proc sql; select distinct group, nGrp, avg(x) as mean from xx group by group;
quit;[/code:1ktf8g2j]
关于分组的建议:如果N《10 没有意义;如果N不被10整除,如何均摊余数是个问题。我想如果n=11,那么一个组2个,九个组1个观察;如果n=23,那么三个组3个,七个组2个观察,如上所示,算是较均衡的方法吧
[quote="jingju11":2gykvuew][code:2gykvuew]data new; do x=1 to 23; output; end; run;
data new1;
do group=1 to 10;
nGrp =ceil((nobs-n)/(11-group));
do k =1 to nGrp;
n +1; output;
end;
end;
set new nobs =nobs;
run;
data xx; merge new1 new; run;
proc sql; select distinct group, nGrp, avg(x) as mean from xx group by group;
quit;[/code:2gykvuew]
关于分组的建议:如果N《10 没有意义;如果N不被10整除,如何均摊余数是个问题。我想如果n=11,那么一个组2个,九个组1个观察;如果n=23,那么三个组3个,七个组2个观察,如上所示,算是较均衡的方法吧[/quote:2gykvuew]