Sas 根据另一个表中列的内容对一个表进行分类
我很感激在这项任务中得到一些帮助,我觉得这有点挑战性 我有两张桌子: 1-表1:包含根据ICD代码系统编码的患者及其诊断(该表实际上有几千行) 2-表2:基本上包含许多ICD诊断组,为了简单起见,让我们假设我们有三列a、B、C,每个列都有代表许多ICD诊断代码的行,下面是一个简化: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 我想做的是创建第三个表,本质
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;