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

Sas 根据另一个表中列的内容对一个表进行分类,sas,Sas,我很感激在这项任务中得到一些帮助,我觉得这有点挑战性 我有两张桌子: 1-表1:包含根据ICD代码系统编码的患者及其诊断(该表实际上有几千行) 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-表1:包含根据ICD代码系统编码的患者及其诊断(该表实际上有几千行)

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组中的任何诊断,如果符合,它将用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

谁能建议一下如何做到这一点?实际上的表当然要大得多

您可以使用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;

若采用数据步骤,这里有一种方法(假设您的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;

数组的效率和速度低于哈希表,但似乎不受内存的限制

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;
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;