Изменение количества таблиц SAS - PullRequest
0 голосов
/ 02 июля 2019

Я пытаюсь использовать следующий код из книги Джека Шостака «Программирование SAS в фармацевтической промышленности» для таблицы лекарств в SAS:

PROC SQL NOPRINT;
    SELECT COUNT(DISTINCT USUBJID) FORMAT = 3.
    INTO :n1
    FROM ADSL
    WHERE TRTPN = 1;
    SELECT COUNT(DISTINCT USUBJID) FORMAT = 3.
    INTO :n2
    FROM ADSL
    WHERE TRTPN = 0;
    SELECT COUNT(DISTINCT USUBJID) FORMAT = 3.
    INTO :n3
    FROM ADSL
    WHERE TRTPN NE .;
QUIT;


PROC SQL NOPRINT;
   CREATE TABLE CMTOSUM AS
   SELECT UNIQUE(C.CMDECOD) AS CMDECOD, C.USUBJID, T.TRTPN
   FROM CM AS C, ADSL AS T
   WHERE C.USUBJID = T.USUBJID
   ORDER BY USUBJID, CMDECOD;
QUIT;

ODS LISTING CLOSE;

ODS OUTPUT CROSSTABFREQS = COUNTS;
PROC FREQ DATA = CMTOSUM;
    TABLES TRTPN * CMDECOD;
RUN;

ODS OUTPUT CLOSE;
ODS LISTING;

PROC SORT DATA = COUNTS;
   BY CMDECOD;
RUN;
DATA CM;
   MERGE COUNTS(WHERE = (TRTPN = 1) RENAME = (FREQUENCY = COUNT1))
         COUNTS(WHERE = (TRTPN = 0) RENAME = (FREQUENCY = COUNT2))
         COUNTS(WHERE = (TRTPN = .) RENAME = (FREQUENCY = COUNT3))
         END = EOF;
         BY CMDECOD;

         KEEP CMDECOD ROWLABEL COL1-COL3 SECTION;
         LENGTH ROWLABEL $25 COL1-COL3 $10;

         IF CMDECOD = '' THEN
            DO;
               ROWLABEL = 'ANY MEDICATION';
                  SECTION = 1;
            END;
            ELSE
            DO;
               ROWLABEL = CMDECOD;
                   SECTION = 2;
            END;

            PCT1 = (COUNT1/ &n1) *100;
            PCT2 = (COUNT2/ &n2) *100;
            PCT3 = (COUNT3/ &n3) *100;

            COL1 = PUT(COUNT1, 3.) || " (" || PUT(PCT1, 3.) || "%)";
            COL2 = PUT(COUNT2, 3.) || " (" || PUT(PCT2, 3.) || "%)";
            COL3 = PUT(COUNT3, 3.) || " (" || PUT(PCT3, 3.) || "%)";

RUN;

Этот код правильно подсчитывает количество предметов в каждом лечениивооружиться конкретными лекарствами.Однако, когда я запускаю этот код, он генерирует счет на основе количества лекарств в строке «ЛЮБОЕ ЛЕКАРСТВО», а не общего количества предметов.В настоящее время процент превышает 100;Я хотел бы изменить счет так, чтобы он остановился, как только он достигнет общего количества предметов в каждой группе лечения.Любое понимание будет оценено.

1 Ответ

0 голосов
/ 02 июля 2019

Мне удалось решить проблему, добавив следующие строки кода:

 IF COUNT1 GE &N1 THEN COUNT1 = &n1;
 IF COUNT2 GE &N2 THEN COUNT2 = &n2;
 IF COUNT3 GE &N3 THEN COUNT3 = &n3;

Это ограничивает общее количество предметов в каждой группе. Ниже обновленный код для справки.

PROC SQL NOPRINT;
    SELECT COUNT(DISTINCT USUBJID) FORMAT = 3.
    INTO :n1
    FROM ADSL
    WHERE TRTPN = 1;
    SELECT COUNT(DISTINCT USUBJID) FORMAT = 3.
    INTO :n2
    FROM ADSL
    WHERE TRTPN = 0;
    SELECT COUNT(DISTINCT USUBJID) FORMAT = 3.
    INTO :n3
    FROM ADSL
    WHERE TRTPN NE .;
QUIT;


PROC SQL NOPRINT;
   CREATE TABLE CMTOSUM AS
   SELECT UNIQUE(C.CMDECOD) AS CMDECOD, C.USUBJID, T.TRTPN
   FROM CM AS C, ADSL AS T
   WHERE C.USUBJID = T.USUBJID
   ORDER BY USUBJID, CMDECOD;
QUIT;

ODS LISTING CLOSE;

ODS OUTPUT CROSSTABFREQS = COUNTS;
PROC FREQ DATA = CMTOSUM;
    TABLES TRTPN * CMDECOD;
RUN;

ODS OUTPUT CLOSE;
ODS LISTING;

PROC SORT DATA = COUNTS;
   BY CMDECOD;
RUN;
DATA CM;
   MERGE COUNTS(WHERE = (TRTPN = 1) RENAME = (FREQUENCY = COUNT1))
         COUNTS(WHERE = (TRTPN = 0) RENAME = (FREQUENCY = COUNT2))
         COUNTS(WHERE = (TRTPN = .) RENAME = (FREQUENCY = COUNT3))
         END = EOF;
         BY CMDECOD;

         KEEP CMDECOD ROWLABEL COL1-COL3 SECTION;
         LENGTH ROWLABEL $25 COL1-COL3 $10;



         IF COUNT1 GE &N1 THEN COUNT1 = &n1;
         IF COUNT2 GE &N2 THEN COUNT2 = &n2;
         IF COUNT3 GE &N3 THEN COUNT3 = &n3;

         IF CMDECOD = '' THEN
            DO;
               ROWLABEL = 'ANY MEDICATION';
                  SECTION = 1;
            END;
            ELSE
            DO;
               ROWLABEL = CMDECOD;
                   SECTION = 2;
            END;

            PCT1 = (COUNT1/ &n1) *100;
            PCT2 = (COUNT2/ &n2) *100;
            PCT3 = (COUNT3/ &n3) *100;

            COL1 = PUT(COUNT1, 3.) || " (" || PUT(PCT1, 3.) || "%)";
            COL2 = PUT(COUNT2, 3.) || " (" || PUT(PCT2, 3.) || "%)";
            COL3 = PUT(COUNT3, 3.) || " (" || PUT(PCT3, 3.) || "%)";

RUN;
...