Автоматизация создания индикаторной переменной в SAS - PullRequest
0 голосов
/ 10 сентября 2018

Я работаю с набором данных SAS, который включает в себя до 30 лекарств, прописанных отдельному пациенту. Лекарства кодируются med1, med2 ... med30. Каждое лекарство представлено 5-значной символьной переменной. Используя идентификатор, я могу затем кодировать название препарата и то, является ли это конкретное лекарство актуальным антибиотиком или системным антибиотиком.

Для каждого пациента я хочу использовать все 30 кодов лекарств, чтобы создать одну переменную, указывающую, получал ли пациент только антибиотик местного действия, только системный антибиотик, или как местный, так и пероральный антибиотик. Поэтому, если какое-либо из 30 лекарств является системным антибиотиком, я хочу, чтобы пациент кодировался как oral_antibiotic = 1.

У меня сейчас есть этот код: данные хотят; установить есть; массивы лекарств [30] med1-med30; если meds [i] in ('06925' '06920') тогда сделайте; пенициллин = 1; oral_antibiotic = 1; конец; иначе, если meds [i] in ('03197') тогда делают; Neosporin = 1; topical_antibiotic = 1; конец; .... (многие делают петли с большим количеством лекарств) бежать;

Проблема в том, что этот код создает одну переменную индикатора вместо 30, перезаписывая предыдущую информацию.

Я думаю, что мне действительно нужно 30 индикаторных переменных, указывающих, является ли каждое из 30 лекарств пероральным или местным антибиотиком, прежде чем я напишу код, который говорит, что если какое-либо из лекарств является пероральным антибиотиком, пациент получил пероральный антибиотик.

Я новичок в макросах и буду очень признателен за помощь.

data current; 
input med1 med2 med3; 
cards; 
'06925' '06920' '03197' ; 
run; 

И я хочу это:

data want; 
input med1 topical_antibiotic1 oral_antibiotic1 med2 topical_antibiotic2 oral_antibiotic2 med3 topical_antibiotic3 oral_antibiotic3; 
cards; 
'06925' 0 1 '06920' 0 1 '03197' 1 0 
; 
run;  

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Я согласен с тем, что вам, вероятно, нужна только одна индикаторная переменная для каждой группы препаратов (интересующее лекарство). Похоже, вы просто хотите знать для каждого предмета, "У них есть это?" Этот пример переворачивает аргументы оператора IN. Если бы вы дали больше примеров данных, я мог бы сделать лучше с этим примером.

data current; 
   infile cards missover;
   array med[3] $5;
   input med[*]; 
   oral_antibotic    = '069'   in: med; /*Assume oral all start with '069'*/;
   topical_antibotic = '03197' in med;
   cards; 
06925 06920 03197
06925 
;;;; 
   run; 

enter image description here

0 голосов
/ 10 сентября 2018

Я думаю, что мне действительно нужно 30 индикаторных переменных, указывающих, является ли каждое из 30 лекарств пероральным или местным антибиотиком, прежде чем я напишу код, который говорит, что, если какое-либо из лекарств является пероральным антибиотиком, пациент получил пероральныйантибиотик.

Это не правда.Ваш текущий подход хорош, если вы не сбрасываете их.Вы не показываете нам полный код, поэтому трудно сказать, но я собираюсь предположить, что это то, что здесь происходит.

Ваша петля должна выглядеть следующим образом:

array med(30) med1-med30;
*set to 0 at top of the loop;
topical_antibiotic=0; oral_antibiotic=0;

do i=1 to dim(med);
   if med(i) in (.....) /*list of topical codes*/ then topical_antibiotic=1;
   else if med(i) in (.....) /*list of oral codes*/ then oral_antibiotic=1;
end;

Это предполагает, что антибиотик не может быть в обеих тематических / оральных группах.Если это возможно, вам нужно удалить ELSE из второго оператора IF.

...