2014-01-13 7 views
1

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

Data DataTable; 
Input Var001 $ Var002; 
Datalines; 
000 050 
063 052 
015 017 
997 035; 
run; 

Мои переменные являются целыми числами (читай в виде текста) от 000 до 999. Там может быть несколько, как два, или больше, чем 500 в зависимости от того, что делает пользователь.

Вторая таблица содержит указания пользовательских группировки переменных в DataTable:

Data Var_Groupings; 
input var $ range $ Group_Desc $; 
Datalines; 
001 025 0-25 
001 075 26-75 
001 999 76-999 
002 030 0-30 
002 050 31-50 
002 060 51-60 
002 999 61-999; 
run; 

(В действительности, эта таблица в регулируется пользователем в Excel, а затем импортировать, но это будет работать для целей исправление проблем).

Переменная «var» в таблице var_groupings соответствует столбцу var в DataTable. Так, например, «var» 001 в таблице var_groupings говорит, что эта группировка будет на var001 в DataTable.

переменная «Диапазон» указывает верхнюю границу группировки. Поэтому, рассматривая диапазоны в таблице var_grouping, где var равно 001, пользователь хочет, чтобы первая группа занимала от 0 до 25, вторая группа - от 26 до 75, а последняя группа - от 76 до 999.

EDIT: столбец Group_Desc может содержать любую строку и необязательно представлен в форме, представленной здесь.

финальный стол должен выглядеть примерно так:

Var001 Var002 Var001_Group Var002_group 
000  050  0-25   31-50 
063  052  26-75  51-60 
015  017  0-25   0-30 
997  035  76-999  31-50 

Я не знаю, как я бы даже приблизиться к что-то вроде этого. Любое руководство, которое вы можете дать, было бы весьма полезно.

ответ

1

Это интересно, спасибо! Его можно решить с помощью CALL EXECUTE, так как нам нужно создавать имена переменных из значений. И, очевидно, PROC FORMAT - это самый простой способ преобразования некоторых значений в диапазоны. Таким образом, комбинируя эти две вещи, которые мы можем сделать что-то вроде этого:

proc sort data=Var_Groupings; by var range; run; 

/*create dataset which will be the source of our formats' descriptions*/ 
data formatset; 
set Var_Groupings; 
    by var; 

    fmtname='myformat'; 
    type='n'; 
    label=Group_Desc; 
    start=input(lag(range),8.)+1; 
    end=input(range,8.); 
    if FIRST.var then start=0; 

    drop range Group_Desc; 
run; 


/*put the raw data into new one, which we'll change to get what we want (just to avoid 
changing the raw one)*/ 
data want; 
    set Datatable; 
run; 

/*now we iterate through all distinct variable numbers. A soon as we find new number 
we generate with CALL EXECUTE three steps: PROC FORMAT, DATA-step to apply this format  
to a specific variable, and then PROC CATALOG to delete format*/ 

data _null_; 
    set formatset; 
    by var; 
    if FIRST.var then do; 
     call execute(cats("proc format library=work cntlin=formatset(where=(var='",var,"')); run;")); 
     call execute("data want;"); 
     call execute("set want;"); 
     call execute(cats('_Var',var,'=input(var',var,',8.);')); 
     call execute(cats('Var',var,'_Group=put(_Var',var,',myformat.);')); 
     call execute("drop _:;"); 
     call execute("proc catalog catalog=work.formats; delete myformat.format; run;"); 
    end; 
run; 

UPDATE. Я изменил первый шаг DATA (для создания форматов), так что теперь конец и начало для каждого диапазона берутся из переменной range, а не Group_Desc. И PROC SORT переместился в начало кода.

+0

Спасибо за помощь Дмитрия. Я ценю это. Тем не менее, я получаю следующую ошибку. 'ПРИМЕЧАНИЕ: CALL EXECUTE сгенерированная строка. 1 + proc format library = work cntlin = formatset (где = (var = '002')); ОШИБКА: этот диапазон повторяется или значения перекрываются: .- .. 1 + run; ' – ApeWithPants

+0

Вы используете точно такой же набор данных Var_Groupings, что в вашем вопросе? Поскольку ошибка означает, что для переменной 002 в этом наборе данных есть перекрывающиеся диапазоны. Но в этом наборе данных нет совпадений (и код работал правильно для меня). –

+0

Проблема заключается в том, что вы определяете форматы. В таблице форматов отсутствуют значения для начала и конца столбцов. Если посмотреть на это, вероятно, это связано с тем, что в моей реальной таблице Var_Groupings столбец Group_Desc может быть любой строкой, а не обязательно формой (ddd-ddd). Прошу прощения, что я не был откровенен в этом отношении. – ApeWithPants

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