【问题标题】:How to read in a column of data in an IF-THEN statement or in a PROC SQL statement, SAS如何在 IF-THEN 语句或 PROC SQL 语句中读取一列数据,SAS
【发布时间】:2019-05-25 18:10:20
【问题描述】:

我有一个 SAS 数据步骤语句 –

Data work.CABGothers2;  
  set work.CABGothers1;  

  IF proc_p in (a HUGE LIST OF ICD10 CODES) and PDDCABG = 1
    and TypeofCABG_PDDTemp = . then TypeofCABG_PDDTemp = 4;

  IF proc2 in (a HUGE LIST OF ICD10 CODES) and PDDCABG = 1
    and TypeofCABG_PDDTemp = . then TypeofCABG_PDDTemp = 4;

  IF proc3 in (a HUGE LIST OF ICD10 CODES) and PDDCABG = 1
    and TypeofCABG_PDDTemp = . then TypeofCABG_PDDTemp = 4;

 ...
run;

这个 IF-THEN 部分持续了 21 次,因此您可以想象这个 sas 代码文件变得多么庞大和繁琐,尤其是在对 ICD10 代码列表进行任何修改时。它必须在所有 proc1,proc2... 列中单独更改。

此外,ICD10 列表非常庞大,有超过 7000 个代码,我想知道是否有人可以向我展示一个更好的 SAS 代码,它可以将文件中的一列数据(ICD10 代码)作为输入。

我想要一个 proc sql 或 Data step 过程。哪个更有效。

当前代码-

Data work.CABGothers2;  
  set work.CABGothers1;  

  IF proc_p in (a HUGE LIST OF ICD10 CODES) and PDDCABG = 1
     and TypeofCABG_PDDTemp = . then TypeofCABG_PDDTemp = 4;
run;

更新--

如果列表很小,我可以使用它...但是我有一个包含 8000 个唯一 ICD10 代码的列。所以我收到如下所示的错误消息。

proc sql;
select quote(icd10) into :cabgvalexcl separated by ',' 
from newlink.cabgvalexcl2019;
quit;

Data work.test1;
    set WORK.cabgpddcol;

    IF proc_p in (&cabgvalexcl.) and PDDCABG = 1 then CABGVAL_Excl = 1;
    IF oproc1 in (&cabgvalexcl.) and PDDCABG = 1 then CABGVAL_Excl = 1 ;
    IF oproc2 in (&cabgvalexcl.) and PDDCABG = 1 then CABGVAL_Excl = 1;
    IF oproc3 in (&cabgvalexcl.) and PDDCABG = 1 then CABGVAL_Excl = 1 ;
    IF oproc4 in (&cabgvalexcl.) and PDDCABG = 1 then CABGVAL_Excl = 1;

run;

**> ERROR message- ERROR: 宏变量值的长度

CABGVALEXCL (65540) 超过最大长度 (65534)。值有 到过 截断为 65534 个字符。**

更新—— 只有 1 列的示例(只有几行)(我没有多列。我在宏示例中这样做是因为宏变量已用完最大空间。)包含 ICD10 代码和我必须在其中标记行的数据文件具有任何 ICD10 代码 -

输出表- 逻辑 - 如果在表 CABGOTHERS1 中找到 cabgvalexcl2019 中列出的任何 ICD10 代码(此处以红色显示),则创建一个名为 - EXCLUDE 的列 - 并将该记录的值设置为 1。

【问题讨论】:

  • 与其构建一个巨大的 ICD10 代码字符串,为什么不使用 PROC SQL 子查询呢?即“proc_p in (select distinct icd10 from icd10col) 和 PDDCABG....' 等情况。
  • 为什么要使用宽格式数据集?这种格式在分析需求中很少有用。请改用长格式。
  • @Craig Srsen - 我没有重复。这些是医疗诊断代码,有 7000 个唯一代码。 @Parfait - 我不知道你的意思。请解释什么是宽格式和长格式。基本上,我有一个包含 1000 多个代码的文件,这些代码变化非常频繁。我希望能够在 if-then 语句中显示的搜索期间在此文件中读取多个列。谢谢
  • 注意,不能用图片作为数据来写代码。请以文本形式发布示例数据。最好作为完全形成的数据步骤。
  • 阅读此页面,这是对宏的介绍,将帮助您了解如何简化逻辑:stats.idre.ucla.edu/sas/seminars/sas-arrays

标签: arrays if-statement sas


【解决方案1】:

这是一个基于哈希的示例。它不使用宏变量,因此它应该适用于任意数量的 ICD10 代码:

data cabgvalexcl2019;
input (icd1-icd3) (:$2.);
datalines;
1 2 3
4 5 6
7 8 9
;
run;

/*Generate some dummy data*/
data cabgpddcol;
    array keys[*] $2 proc_p oproc1-oproc20;
    call streaminit(1); /*Set random number seed*/
    do i = 1 to 20;
        do j = 1 to dim(keys);
            keys[j] = put(int(rand('uniform') * 11 + 9), 2.); /*Chosen so we get a few rows with no exclusion codes*/
        end;
        PDDCABG = rand('uniform') < 0.75;
        output;
    end;
    drop i j;
run;

/*  CABGval_Excl = Identify CABG+VALVE exclusions which are "CABG OTHERS".  This is the 2019 CABG+VALVE exclusion list. */

/*  If the RECORD IN following table has CABGVAL_Excl = 1 then it is a CABG+valve WITH EXCLUSION*/
Data work.CABGval_Excl;  /* CABG OTHERS prior to refinement into non-iso CABG WITH Valve and non-iso CABG WITHOUT Valve */

    /*Create hash object to hold list of ICD codes*/
    length icd $ 2;
    if _n_ = 1 then do;
        declare hash h();
        rc = h.definekey('icd');
        rc = h.definedone();
        do until(eof);
            set cabgvalexcl2019 end = eof;
            /*Consider using an array here if you have lots of ICD columns*/
            do icd = icd1, icd2, icd3;
                rc = h.add();
            end;
        end;
    end;

    set cabgpddcol;

    /*Loop through all the keys and stop if we find one in the hash*/    
    array keys[*] proc_p oproc1-oproc20;
    rc = -1;
    do i = 1 to dim(keys) until(rc = 0);
        rc = h.find(key:keys[i]); /*This sets rc = 0 if a match is found*/
    end;

    drop i rc icd:;

    CABGVAL_Excl = rc ne 0 and PDDCABG = 1;
run;

如果您有多个列包含您关心的所有不同的 ICD10 代码,那么构造散列对象有点繁琐 - 如果它们都在一个列中,那么有一种更简单的方法:

        declare hash h(dataset:'cabgvalexcl2019');
        rc = h.definekey('icd');
        rc = h.definedone();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多