arrays - 修改 SAS 表计数
问题描述
我正在尝试将 Jack Shostak 的“制药行业中的 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;我想修改计数,使其在达到每个治疗组中的受试者总数时停止。任何见解将不胜感激。
解决方案
我能够通过添加以下代码行来解决该问题:
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;
推荐阅读
- amazon-web-services - 从一个域到另一个域的 URL 转发,保留参数
- javascript - 根据地图值启用按钮 React
- windbg - WinDbg 脚本 - 如何删除文件?
- angular - ngrx 适配器 updateOne
- flutter - Flutter:Speech to text 错误在 null 上调用了“initialize”方法
- r - R时间序列数据图 - 色调+平均实线
- dataframe - 使用新的“其他变量”创建新列
- c# - IIS 没有收到对 HTML 的更新?
- python - Pandas 将每年与某个属性关联的列合并为单独的列
- javascript - 有没有办法使用 Web Audio API 重新采样音频流?