Как читать в столбце данных в операторе IF-THEN или в операторе PROC SQL, SAS - PullRequest
0 голосов
/ 25 мая 2019

У меня есть оператор шага данных 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) из файла.

Я хотел бы, чтобы процедура sql или Data пошаговая процедура.Что бы ни было более эффективным.

Текущий код-

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;

**> Сообщение об ошибке - ОШИБКА: длина значения макропеременной

CABGVALEXCL (65540) превышаетмаксимальная длина (65534).Значение было усечено до 65534 символов. **

UPDATE - eXAMPLE (JUST FEW ROWS) ТОЛЬКО 1 столбца (у меня нет нескольких столбцов. Я сделал это в примере с макросом, потому что макросВ переменной не хватило места.), содержащей коды ICD10 и файл данных, в котором мне нужно пометить строки, содержащие любой из кодов ICD10 -

ICD10 Code list - single COLUMN

Input data table

Таблица ВЫХОДА- LOgic - Если какой-либо из кодов ICD10, перечисленных в cabgvalexcl2019 (показанный здесь в RED), найден в таблице CABGOTHERS1,создайте столбец с именем - EXCLUDE - и установите значение 1 для этой записи.

Desired output table

1 Ответ

0 голосов
/ 26 мая 2019

Вот пример на основе хеша.Он не использует макропеременные, поэтому он должен работать для любого числа кодов 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();
...