SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 1163|回复: 3
打印 上一主题 下一主题

SAS编程问题求助

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2007-2-12 15:02:15 | 只看该作者

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个观测时,已经知道了数据集的名字,再用编程判断感觉没什么实际意义
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2007-2-13 14:30:25 | 只看该作者

re:

sashelp.vtable中的字段nobs,表示表的记录数
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2007-2-13 20:34:36 | 只看该作者

re

用data step的first.variable  last.variable就可以了。再储存一下前三个的个数、和就可以了。
没有这么复杂吧。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2007-2-13 20:43:22 | 只看该作者

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;
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-12 18:42 , Processed in 0.092486 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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