2012-06-01 4 views
3

У меня есть два набора данных в SAS, которые я хотел бы объединить, но у них нет общих переменных. Один набор данных имеет переменную subject_id, а в другой - переменную mom_subject_id. Обе эти переменные представляют собой 9-значные коды, которые имеют только 3 цифры в середине кода с общим значением, и это то, что мне нужно, чтобы соответствовать двум наборам данных, когда я их объединять.Как создать новую переменную в SAS, извлекая часть значения существующей числовой переменной?

Что я хотел бы сделать, так это создать новую общую переменную в каждом наборе данных, которая всего лишь 3 цифры из идентификатора объекта. Эти 3 цифры всегда будут находиться в одном и том же месте в пределах 9-значного идентификатора объекта, поэтому мне интересно, есть ли способ извлечь эти 3 цифры из переменной, чтобы создать новую переменную.

Спасибо!

ответ

7

SQL (с использованием выборки данных из кода Шаг данных): Шаг

proc sql; 
create table want2 as 
select a.subject_id, a.other, b.mom_subject_id, b.misc 
from have1 a JOIN have2 b 
    on(substr(a.subject_id,4,3)=substr(b.mom_subject_id,4,3)); 
quit; 

данных:

data have1; 
    length subject_id $9; 
    input subject_id $ other $; 
    datalines; 
    abc001def other1 
    abc002def other2 
    abc003def other3 
    abc004def other4 
    abc005def other5 
    ; 

data have2; 
    length mom_subject_id $9; 
    input mom_subject_id $ misc $; 
    datalines; 
    ghi001jkl misc1 
    ghi003jkl misc3 
    ghi005jkl misc5 
    ; 

data have1; 
    length id $3; 
    set have1; 
    id=substr(subject_id,4,3); 
run; 

data have2; 
    length id $3; 
    set have2; 
    id=substr(mom_subject_id,4,3); 
run; 

Proc sort data=have1; 
    by id; 
run; 

Proc sort data=have2; 
    by id; 
run; 

data work.want; 
    merge have1(in=a) have2(in=b); 
    by id; 
run; 
0

альтернативой было бы использовать

proc sql 

, а затем использовать присоедините и substr() так же, как explai ned выше, если вам удобно с sql

0

Предполагая, что ваша переменная "subject_id" является числом, то функция substr не будет работать, поскольку sas попытается преобразовать число в строку. Но по умолчанию он занимает несколько шагов слева от номера.

Вы можете использовать функцию модуля mod(input, base), которая возвращает остаток, когда вход делится на базу.

/*First get rid of the last 3 digits*/ 
temp_var = floor(subject_id/1000); 
/* then get the next three digits that we want*/ 
id = mod(temp_var ,1000); 

Или в одной строке:

id = mod(floor(subject_id/1000), 1000); 

Затем вы можете продолжить сортировку новых наборов данных по идентификатору, а затем объединять.

Смежные вопросы