Hi forum! I have to create a medical score depending on several categories; i.e. cerebrovascular disease, cardiac disease, neurological disease. Each of these diseases have several ICD10-codes connected to them. So for instance 'Cerebrovascular Disease' could have 'DG45', 'DG46' etc. I have a huge look-up table and i would like to look this through using two arrays. One array containing the categories and several arrays containing the ICD-10 codes. I'm having trouble using this two-layered array-approach, can you help me? This is a much simplified version of my dataset and categories. data have;
input id disease $;
cards;
1 DG451
2 DG313
3 DG462
4 DG461A
5 DI14
6 DI13B
7 DI69
8 DI141
;
run;
data lookup;
set have;
array diseasecategory1 {2} $4 _temporary_ ('DG45' 'DG46');
array diseasecategory2 {1} $4 _temporary_ ('DI14'); /* IN THE REAL WORLD I HAVE CATEGORIES UP TO 13 AND THEY CAN EACH CONTAIN UP TO 30 VALUES */
array categoryindex {2} $25 _temporary_ ('diseasecategory1' 'diseasecategory2'); /*THIS WOULD THEN NEED TO GO ON TO 13 */
do i = 1 to dim(categoryindex);
do c = 1 to dim(categoryindex{i});
if find(disease,strip(cat(categoryindex{i},'{',c,'}'))) > 0 then counter +1;
end;
end;
run; The problems are as follows: - In the second DO-loop i can't use the DIM-function on the value of the categoryindex-array - In the FIND-function i can't combine the value of categoryindex-array and the counting variable of the do loop. I hope you can help me 🙂 ***EDIT*** Thanks for replying Paige Miller, it seems i need to elaborate a bit more. I'll try my best. So with my real world data i have 13 disease categories. Each category can have up to 30 different values. So that would be the equivalent of: array diseasecategory1...13 {4...30} $12 _temporary_ ('DGX1' 'DGX2' 'DIX4' ..... DZ30'); And then i would use the DO-loop to add 1 to a counting variable. So for instance if a patient had one disease in three diseasecategories, their final score would be 3. *** EDIT 2 *** What i want: So I want to calculate a comorbidity score based on the diagnoses the patient has in the history. So for each patient i look through their entire history of diagnoses, if they match one in one of the categories, the score goes up by 1. I thought it would confuse more than clarify: data patientlist;
input patientid;
cards;
1
2
3
4
5
;
run;
data diagnosishistory;
input patientid icdcode $;
cards;
1 DG451
1 DG313
1 DG462
1 DG461A
2 DG45
2 DI13B
2 DI49
3 DI151
;
run;
data lookup;
if _N_ = 1 then do;
if 0 then set diagnosishistory;
dcl hash pat (dataset:'diagnosishistory',multidata:'y');
pat.definekey('patientid');
pat.definedata('ICDCode');
pat.definedone();
end;
set patientlist;
by patientid;
retain SCORE lock;
if first.patientid then do;
call missing(score, lock);
end;
array diseasecategory1 {2} $4 _temporary_ ('DG45' 'DG46');
array diseasecategory2 {2} $4 _temporary_ ('DI14' 'DI49');
array categoryindex {2} $25 _temporary_ ('diseasecategory1' 'diseasecategory2');
do _iorc_ = pat.find() by 0 while (_iorc_ = 0);
do i = 1 to dim(categoryindex);
do c = 1 to dim(categoryindex{i});
if find(disease,strip(cat(categoryindex{i},'{',c,'}'))) > 0 then SCORE + 1;
end;
end;
_iorc_ = pat.find_next();
end;
run;
So in this example, my desired output would be like: Patient 1, score = 3 (Because he has one diagnosis with DG45 and two with DG46 in his history) Patient 2, score = 2 (Because he has one DG45 and one DI49 in his history) Patient 3, score = 0 (Because she hasn't got any of the diagnoses in history)
... View more