SAS中文论坛

标题: SAS编程问题求助 [打印本页]

作者: shiyiming    时间: 2007-2-12 15:02
标题: SAS编程问题求助
目的:计算每个ID的dosage 的平均值,但这个平均值有特殊要求,如果服药次数大于3,就不计算前三次服药的剂量,而计算后面所有剂量的平均剂量;如果服药次数小于等于3则要计算前三次的均数。比如001号服药9次,需要去掉前3次,然后计算后6次的平均值;002只服药3次,就要平均这三次的剂量;004号只服药两次因此需要计算这两次的均值。003号只需要计算后5次的服药均数。


数据如下:


Data a;
input ID$ dosage;
datalines;
001 5
001 5
001 7
001 8
001 9
001 7
001 7
001 7
001 7
002 3
002 3
002 3
003 4
003 5
003 6
003 7
003 9
003 9
003 9
003 9
004 2
004 2
005 3
005 3
005 3
005 3
005 3
005 3
;
run;

我自己的思路是把每个人都生成一个数据库,然后去掉前3个观测,在算均值, output后在合并。以上可以用宏完成,但是在处理002号和005号时遇到了问题,他们的观测都是零,我无法实现观测数小于3时,不对数据进行删除。

以下是部分宏供大家参考。

proc sort data=a;
by ID;
run;
%Macro divide1(N=);
%Do i=1 %to &N;
Data D&i;
set a;
NewID=input(ID,3.);
run;
Data D&i;
Set D&i;
by NewID;
where NewID=&i;
count=_N_;
run;
Data D&i;
Set D&i;
if count>3;
run;
%end;
%Mend divide1;
%divide1(N=5);

另外如果我生成了很多临时数据集,如何判断哪个数据集含有0个观测?然后把这些含有0个观测的数据集删除?因为有很多数据集,事先我并不知道数据集的名字。看过以前的帖子,判断是否有0个观测时,已经知道了数据集的名字,再用编程判断感觉没什么实际意义
作者: shiyiming    时间: 2007-2-13 14:30
标题: re:
sashelp.vtable中的字段nobs,表示表的记录数
作者: shiyiming    时间: 2007-2-13 20:34
标题: re
用data step的first.variable  last.variable就可以了。再储存一下前三个的个数、和就可以了。
没有这么复杂吧。
作者: shiyiming    时间: 2007-2-13 20:43
标题: re
data themean;
        retain number sum numbertemp sumtemp 0;
        set a;
        keep id agemean;
        by id;
        if first.id then do;number=0; sum=0;end;
        sum+dosage;
        number+1;
        if number=3 then do;numbertemp=number; sumtemp=sum;end;
        if last.id then do;
                if number>3 then do; number+(-3); sum=sum-sumtemp;
                                                         agemean=sum/number; end;
                else  agemean=sumtemp/numbertemp;
                output;
        end;
run;
proc print;run;




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