2015-02-20 2 views
0

Я хотел бы сделать новую переменную в моем наборе данных. Эта переменная является просто бинарной переменной, если у кого-то есть заболевание табака или нет. Я смотрю данные пациентов с каждым пациентом, имеющим до 9 кодов болезни. У меня есть набор данных, называемый табаком, в котором хранятся все коды болезни табака.SAS. Создает новую переменную, если условия соответствуют другой переменной?

Это то, что я думал, что я мог бы сделать:

data outpreg; 
set outpreg; 
if diag1 = tobacco OR diag2 = tobacco OR diag3 = tobacco or diag4 = tobacco or diag5 = tobacco or diag6 = tobacco or 
diag7 = tobacco or diag8 = tobacco or diag9 = tobacco then co2=1; 
run; 

Но это дает мне слишком много для того, чтобы быть правильным. Любая помощь будет принята с благодарностью.

+0

Вы не можете использовать табак в таком порядке, вам необходимо либо объединить или использовать поиск каким-то образом. Нам нужна дополнительная информация о том, как структурированы наборы данных, если вам нужна дополнительная помощь. – Reeza

+0

Merge - набор данных «табак» и «пациент» для первичного ключа или общей переменной между ними, а затем вы можете использовать свой код с небольшой модификацией - табак будет в кавычках – NEOmen

ответ

1

Это не то, что вы хотите сделать. Ваш текущий код пытается сравнить значение diag1 с переменной с именем tobacco в том же наборе данных outpreg. Поскольку нет переменной tobacco, SAS создает новую переменную tobacco и инициализирует ее отсутствием .. Чтобы сделать то, что вы хотите, я присоединился бы к набору данных outpreg к набору данных tobacco для каждой переменной diag.

proc sql; 
select 
    o.*, 
    t1.tobacco_cd is not null or 
    t2.tobacco_cd is not null or 
    t3.tobacco_cd is not null as co2 
from 
    outpreg as o 
    left join tobacco as t1 
    on o.diag1 = t1.tobacco_cd 
    left join tobacco as t2 
    on o.diag2 = t2.tobacco_cd 
    left join tobacco as t3 
    on o.diag3 = t3.tobacco_cd 
; 
quit; 

Это проверяет каждую переменную diag против списка кодов, установка co2 к 1, если он совпадает, и 0, если он не делает. Например, если соответствует diag1, то значение t1.tobacco_cd is not null будет истинным, а все выражение будет равно 1.

Вам нужно будет расширить его, чтобы охватить все девять переменных вместо трех.

Другой вариант - поместить ваши коды табака в формат, подобный Джо, предложенный в этом question.

proc format; 
    value $tobaccocd 
    '30300','30301','30302','30303'= 'Tobacco' 
    other='Not Tobacco'; 
quit; 

Тогда вы можете создать свою co2 переменную в шаге данных, как это:

data outpreg2; 
    set outpreg; 
    if put(diag1,$tobaccocd.) = 'Tobacco' or 
    put(diag2,$tobaccocd.) = 'Tobacco' or 
    put(diag3,$tobaccocd.) = 'Tobacco' then co2 = 1; 
    else co2 = 0; 
run; 
Смежные вопросы