OK I have a macro that does work below however I am looking to execute a macro within a data step as if this works-there will be other computations
This macro will designate if a patient has a disease based on ICD 10 code groupings -
Any assistance appreciated. TIA
What works:
data fake_patients;
length subject $5 ICD1-ICD10 $7;
array icd_codes[10] $ ICD1-ICD10;
/* List of ICD-10 codes for various diseases */
array pneumonia_codes[10] $7 _temporary_ ('J12.0', 'J12.1', 'J12.2', 'J12.3', 'J12.4',
'J12.5', 'J12.8', 'J12.9', 'J13', 'J14');
array diabetes_codes[8] $7 _temporary_ ('E10.9', 'E11.9', 'E13.9', 'E14.9',
'E10.65', 'E11.65', 'E13.65', 'E14.65');
array hypertension_codes[10] $7 _temporary_ ('I10', 'I11.0', 'I11.9', 'I12.0',
'I12.9', 'I13.0', 'I13.10', 'I13.11',
'I13.2', 'I15.0');
array asthma_codes[10] $7 _temporary_ ('J45.20', 'J45.21', 'J45.22', 'J45.30',
'J45.31', 'J45.32', 'J45.40', 'J45.41',
'J45.42', 'J45.50');
array other_codes[10] $7 _temporary_ ('A00', 'A01', 'A02', 'A03', 'A04',
'A05', 'A06', 'A07', 'A08', 'A09');
/* Create 50 fake patients */
do subject_id = 1 to 50;
subject = cats('S', put(subject_id, z3.));
/* Assign random ICD-10 codes to each patient */
do i = 1 to 10;
/* Randomly choose a disease category */
disease_category = rand('integer', 1, 5);
select (disease_category);
when (1) icd_codes[i] = pneumonia_codes[rand('integer', 1, dim(pneumonia_codes))];
when (2) icd_codes[i] = diabetes_codes[rand('integer', 1, dim(diabetes_codes))];
when (3) icd_codes[i] = hypertension_codes[rand('integer', 1, dim(hypertension_codes))];
when (4) icd_codes[i] = asthma_codes[rand('integer', 1, dim(asthma_codes))];
when (5) icd_codes[i] = other_codes[rand('integer', 1, dim(other_codes))];
end;
end;
output;
end;
run;
data diseases;
length disease $20 DX1-DX10 $7;
/* Pneumonia and its ICD-10 codes */
disease = "Pneumonia";
DX1 = 'J12.0'; DX2 = 'J12.1'; DX3 = 'J12.2'; DX4 = 'J12.3';
DX5 = 'J12.4'; DX6 = 'J12.5'; DX7 = 'J12.8'; DX8 = 'J12.9';
DX9 = 'J13'; DX10 = 'J14';
output;
/* Diabetes and its ICD-10 codes */
disease = "Diabetes";
DX1 = 'E10.9'; DX2 = 'E11.9'; DX3 = 'E13.9'; DX4 = 'E14.9';
DX5 = 'E10.65'; DX6 = 'E11.65'; DX7 = 'E13.65'; DX8 = 'E14.65';
DX9 = ''; DX10 = '';
output;
/* Hypertension and its ICD-10 codes */
disease = "Hypertension";
DX1 = 'I10'; DX2 = 'I11.0'; DX3 = 'I11.9'; DX4 = 'I12.0';
DX5 = 'I12.9'; DX6 = 'I13.0'; DX7 = 'I13.10'; DX8 = 'I13.11';
DX9 = 'I13.2'; DX10 = 'I15.0';
output;
/* Asthma and its ICD-10 codes */
disease = "Asthma";
DX1 = 'J45.20'; DX2 = 'J45.21'; DX3 = 'J45.22'; DX4 = 'J45.30';
DX5 = 'J45.31'; DX6 = 'J45.32'; DX7 = 'J45.40'; DX8 = 'J45.41';
DX9 = 'J45.42'; DX10 = 'J45.50';
output;
run;
%macro sendR2D2(data=, var=);
proc sort data=&data(keep=&var) out=values nodupkey;
by &var;
run;
data _null_;
set values end=last;
call symputx('DIS'||left(_n_), &var);
if last then call symputx('countx', _n_, 'g');
run;
%put _local_;
%do i=1 %to &countx;
proc sql noprint;
select catx(',', compress("'"||DX1||"'"), compress("'"||DX2||"'"), compress("'"||DX3||"'"),
compress("'"||DX4||"'"),compress("'"||DX5||"'"),compress("'"||DX6||"'"), compress("'"||DX7||"'"), compress("'"||DX8||"'"), compress("'"||DX9||"'"), compress("'"||DX10||"'"))
into :DX
from diseases where disease="&&DIS&i";
quit;
%put &DX;
data &&DIS&i (Keep= subject &&DIS&i);
set work.fake_patients;
array icd_codes[10] $ ICD1-ICD10;
&&DIS&i=0;
do j = 1 to dim(icd_codes);
if icd_codes[j] in (&DX) then do;
&&DIS&i=1;
leave;
end;
end;
run;
%end;
%mend;
%sendR2D2(data=diseases,var=disease);
Data want2;
merge work.fake_patients work.asthma work.diabetes work.hypertension work.pneumonia;
by subject;
run;
What doesn't work and need to resolve:
data fake_patients;
length subject $5 ICD1-ICD10 $7;
array icd_codes[10] $ ICD1-ICD10;
/* List of ICD-10 codes for various diseases */
array pneumonia_codes[10] $7 _temporary_ ('J12.0', 'J12.1', 'J12.2', 'J12.3', 'J12.4',
'J12.5', 'J12.8', 'J12.9', 'J13', 'J14');
array diabetes_codes[8] $7 _temporary_ ('E10.9', 'E11.9', 'E13.9', 'E14.9',
'E10.65', 'E11.65', 'E13.65', 'E14.65');
array hypertension_codes[10] $7 _temporary_ ('I10', 'I11.0', 'I11.9', 'I12.0',
'I12.9', 'I13.0', 'I13.10', 'I13.11',
'I13.2', 'I15.0');
array asthma_codes[10] $7 _temporary_ ('J45.20', 'J45.21', 'J45.22', 'J45.30',
'J45.31', 'J45.32', 'J45.40', 'J45.41',
'J45.42', 'J45.50');
array other_codes[10] $7 _temporary_ ('A00', 'A01', 'A02', 'A03', 'A04',
'A05', 'A06', 'A07', 'A08', 'A09');
/* Create 50 fake patients */
do subject_id = 1 to 50;
subject = cats('S', put(subject_id, z3.));
/* Assign random ICD-10 codes to each patient */
do i = 1 to 10;
/* Randomly choose a disease category */
disease_category = rand('integer', 1, 5);
select (disease_category);
when (1) icd_codes[i] = pneumonia_codes[rand('integer', 1, dim(pneumonia_codes))];
when (2) icd_codes[i] = diabetes_codes[rand('integer', 1, dim(diabetes_codes))];
when (3) icd_codes[i] = hypertension_codes[rand('integer', 1, dim(hypertension_codes))];
when (4) icd_codes[i] = asthma_codes[rand('integer', 1, dim(asthma_codes))];
when (5) icd_codes[i] = other_codes[rand('integer', 1, dim(other_codes))];
end;
end;
output;
end;
run;
data diseases;
length disease $20 DX1-DX10 $7;
/* Pneumonia and its ICD-10 codes */
disease = "Pneumonia";
DX1 = 'J12.0'; DX2 = 'J12.1'; DX3 = 'J12.2'; DX4 = 'J12.3';
DX5 = 'J12.4'; DX6 = 'J12.5'; DX7 = 'J12.8'; DX8 = 'J12.9';
DX9 = 'J13'; DX10 = 'J14';
output;
/* Diabetes and its ICD-10 codes */
disease = "Diabetes";
DX1 = 'E10.9'; DX2 = 'E11.9'; DX3 = 'E13.9'; DX4 = 'E14.9';
DX5 = 'E10.65'; DX6 = 'E11.65'; DX7 = 'E13.65'; DX8 = 'E14.65';
DX9 = ''; DX10 = '';
output;
/* Hypertension and its ICD-10 codes */
disease = "Hypertension";
DX1 = 'I10'; DX2 = 'I11.0'; DX3 = 'I11.9'; DX4 = 'I12.0';
DX5 = 'I12.9'; DX6 = 'I13.0'; DX7 = 'I13.10'; DX8 = 'I13.11';
DX9 = 'I13.2'; DX10 = 'I15.0';
output;
/* Asthma and its ICD-10 codes */
disease = "Asthma";
DX1 = 'J45.20'; DX2 = 'J45.21'; DX3 = 'J45.22'; DX4 = 'J45.30';
DX5 = 'J45.31'; DX6 = 'J45.32'; DX7 = 'J45.40'; DX8 = 'J45.41';
DX9 = 'J45.42'; DX10 = 'J45.50';
output;
run;
%macro sendR2D3 (data=, var=);
proc sort data=&data(keep=&var) out=values nodupkey;
by &var;
run;
data _null_;
set values end=last;
call symputx('DIS'||left(_n_), &var);
if last then call symputx('countx', _n_, 'g');
run;
%put _local_;
%do i=1 %to &countx;
proc sql noprint;
select catx(',', compress("'"||DX1||"'"), compress("'"||DX2||"'"), compress("'"||DX3||"'"),
compress("'"||DX4||"'"),compress("'"||DX5||"'"),compress("'"||DX6||"'"), compress("'"||DX7||"'"), compress("'"||DX8||"'"), compress("'"||DX9||"'"), compress("'"||DX10||"'"))
into :DX
from diseases where disease="&&DIS&i";
quit;
%put &DX;
array icd_codes[10] $ ICD1-ICD10;
&&DIS&i=0;
do j = 1 to dim(icd_codes);
if icd_codes[j] in (&DX) then do;
&&DIS&i=1;
leave;
end;
end;
run;
%end;
%mend;
Data want3;
set work.fake_patients;
%sendR2D3(data=diseases,var=disease);
run;
... View more