2015-06-09 7 views
0

Я ценю некоторую помощь в выполнении этой задачи, которую я нахожу немного сложной У меня есть две таблицы: 1- Таблица 1: Содержащие пациентов и их диагноз, закодированные в соответствии с ICD код системы (таблица имеет несколько тысяч строк в действительности)Категоризировать одну таблицу на основе содержимого столбца в другой таблице

Patient Diagnosis 
JOHN A1 
ALEX A12 
ZAK K12 
RICHARD A25 
SAM G3 
MANNY H2 

2- таблица 2: в основном содержит ряд МКБ диагностики групп, для простоты будем говорить, что мы имеем три столбца A, B, C каждый из которых имеет строки, представляющие собой ряд кодов диагностики ICD, здесь приводится упрощение:

Group A Group B Group C 
A12 A21 C13 
A25 A33 J12 
H12 G1 A1 
K12 K77 L5 
G1 J12 A12 
D3 A25 G3 

Что я хотел бы сделать, это создать третью таблицу, которая по существу табл. 1 плюс еще три столбца для каждой группы A, B и C. Затем код будет проходить через каждую строку и посмотреть, не обнаружен ли диагноз ICD в таблице 1 подходит любой из диагнозов в группах а, в и с, и если так будет заполнить соответствующую ячейку с 1 в противном случае 0. Вот финальный стол просто объяснить:

Diagnosis Group A Group B Patient Group C 
A1 0 0 JOHN 1 
A12 1 0 ALEX 1 
K12 1 0 ZAK 0 
A25 1 1 RICHARD 0 
G3 0 0 SAM 1 
H2 0 0 MANNY 0 

может кто-нибудь предложить, пожалуйста, как это может быть сделанный? Таблицы на самом деле, конечно, намного больше.

ответ

1

Чтобы выполнить это, вы можете использовать инструкцию PROC SQL. Я сделал что-то вроде этого.

DATA TABLE1; 
    INPUT PATIENT $ DIAGNOSIS $; 
CARDS; 
JOHN A1 
ALEX A12 
ZAK K12 
RICHARD A25 
SAM G3 
MANNY H2 
; 
RUN; 

DATA TABLE2; 
    INPUT GROUPA $ GROUPB $ GROUPC $; 
CARDS; 
A12 A21 C13 
A25 A33 J12 
H12 G1 A1 
K12 K77 L5 
G1 J12 A12 
D3 A25 G3 
; 
RUN; 

PROC SQL; 
    CREATE TABLE RESULTSET AS 
    SELECT 
     A.DIAGNOSIS, 
     MAX(CASE WHEN B.GROUPA IS NULL THEN 0 ELSE 1 END) AS GROUPA, 
     MAX(CASE WHEN C.GROUPB IS NULL THEN 0 ELSE 1 END) AS GROUPB, 
     A.PATIENT, 
     MAX(CASE WHEN D.GROUPC IS NULL THEN 0 ELSE 1 END) AS GROUPC 
    FROM TABLE1 A 
    LEFT JOIN TABLE2 B 
     ON A.DIAGNOSIS = B.GROUPA 
    LEFT JOIN TABLE2 C 
     ON A.DIAGNOSIS = C.GROUPB 
    LEFT JOIN TABLE2 D 
     ON A.DIAGNOSIS = D.GROUPC 
    GROUP BY 
     A.DIAGNOSIS, 
     A.PATIENT; 
QUIT; 
1

Если прибегнуть к Шаге данных, вот один из способов (с учетом объема оперативной памяти достаточно велик, чтобы вместить весь словарь кодов МКБ), может быть более эффективным, чем Proc SQL.

data have; 
    input (Patient Diagnosis) (:$8.); 
    cards; 
JOHN A1 
ALEX A12 
ZAK K12 
RICHARD A25 
SAM G3 
MANNY H2 
; 

data codes; 
    input (GroupA GroupB GroupC) (:$8.); 
    cards; 
A12 A21 C13 
A25 A33 J12 
H12 G1 A1 
K12 K77 L5 
G1 J12 A12 
D3 A25 G3 
; 

data want; 
    if _n_=1 then 
     do; 
      declare hash h(); 
      h.definekey('group','value'); 
      h.definedone(); 

      do until (last); 
       set codes end=last; 
       array grp _character_; 

       do over grp; 
        group=vname(grp); 
        value=grp; 
        rc=h.replace(); 
       end; 
      end; 
     end; 

    set have; 
    grpa=not h.check(key:'GroupA', key:diagnosis); 
    grpb=not h.check(key:'GroupB', key:diagnosis); 
    grpc=not h.check(key:'GroupC', key:diagnosis); 
    drop group: value rc; 
run; 
0

Эффективность и скорость массива ниже, чем хэш-таблицы, но она приличнее не ограничивается памяти.

data want; 
    set table1; 
    if _n_=1 then do; 
    do i=1 by 1 until(last); 
    set table2 end=last; 
    array dig[10000] $ _temporary_; 
    array grp groupa--groupc; 
    do j=1 to 3; 
     n+1; 
     dig(n)=grp(j); 
    end; 
    end; 
    end; 
    grpA=0;grpB=0;grpC=0; 
    do i=1 to n; 
    if DIAGNOSIS=dig(i) then do; 
     if mod(i,3)=1 then grpA=1; 
     else if mod(i,3)=2 then grpB=1; 
     else grpC=1; 
    end; 
    end; 
    drop i j n groupA--GroupC; 
run; 
Смежные вопросы