首页 > 技术文章 > SAS笔记(5) FLAG和计数器

zhangzhangwhu 2017-07-25 09:58 原文

考虑这样一种场景:我们有一份患者入院检查的数据,我们知道一个患者有可能会多次去医院做检查,每次检查的结果可能为阳性,也可能为阴性。我们现在关注的是某一个患者在若干次检查中是否出现了阳性结果,在R中我们可以使用any函数,在python中可以利用pandas的groupby函数,在SAS中该如何处理呢?今天就立一个flag来解决它。

1.

***创建数据
DATA LAB;
   INPUT PATNO VISIT_NO OUTCOME;
DATALINES;
3 1 0
3 2 0
3 3 1
1 1 0
1 2 1
1 3 0
1 4 1
2 1 0
2 2 0
4 1 1
4 2 1
4 3 1
;

***利用Flag变量记住前一个观测的值 
PROC SORT DATA=LAB;
   BY PATNO VISIT_NO;
RUN;

DATA FLAG_TEST;
   SET LAB;
   BY PATNO;

   RETAIN FLAG; ***如果结果阳性,FLAG=1;

   ***初始化 FLAG;
   IF FIRST.PATNO = 1 THEN FLAG = 0;

   ***如果结果阳性,FLAG=1;
   IF OUTCOME = 1 THEN FLAG = 1;

   ***运行到最后一个观测时输出;
   IF LAST.PATNO = 1 THEN OUTPUT;
   DROP OUTCOME VISIT_NO;
RUN;

PROC PRINT DATA=FLAG_TEST;
   TITLE "Listing of Data Set FLAG_TEST";
RUN;

2.利用SUM语句计算每一个病人的阳性结果数目

***注意:数据集lab必须是排好序的;
DATA COUNT_TEST;
   SET LAB;
   BY PATNO;

   ***这里没有必要RETAIN COUNT,因为SUM语句会自动RETAIN

   ***初始化 COUNT;
   IF FIRST.PATNO = 1 THEN COUNT = 0;

   ***出现阳性结果,COUNT加一;
   IF OUTCOME = 1 THEN COUNT + 1;

   ***当遇到最后一个病人,输出;
   IF LAST.PATNO = 1 THEN OUTPUT;
   DROP OUTCOME;
RUN;
PROC PRINT DATA=COUNT_TEST;
   TITLE "Listing of Data Set COUNT_TEST";
RUN;

 

 

参考资料:《Longitudinal Data and SAS: A Programmer's Guide》

推荐阅读