根据另一个表中列的内容对一个表进行分类

时间:2015-06-09 13:30:04

标签: sas

我很欣赏这项任务的一些帮助,我觉得这有点挑战性 我有两张桌子: 1-表1:根据ICD代码系统对患者及其诊断进行编码(该表实际上有几千行)

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

2-表2:基本上包含了许多ICD诊断组,为了简单起见,我们说我们有三列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组。然后代码将遍历每一行,看看表1中的ICD诊断是否适合组A,B和C中的任何诊断,如果是这样,它将填充相应的单元格,否则为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

有人可以建议如何做到这一点吗?现实中的表格当然要大得多

3 个答案:

答案 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 :(得分:1)

如果采用数据步骤,这里有一种方法(鉴于你的RAM足够容纳整个ICD代码字典),可能比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;

答案 2 :(得分: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;