2015-01-17 4 views
2

Я хочу, чтобы преобразовать значение с помощью простой таблицы преобразования, как это:Числовой числовой, с форматом

invalue eg2atptnum 
    1 = 0 
    2 = 2 
    3 = 4 
    4 = 6 
    5 = 8 
    6 = 24; 

input() требует символа для ввода. Есть ли более простой способ, чем atptnum=input(put(mod(egtptnum,10),best.),eg2atptnum.);, чтобы избежать неявного преобразования типов?

Оба atptnum и egtptnum являются числовыми.

ответ

0

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

IE:

atptnum = input(cats(mod(egatptnum,10)),egatptnum.); 

Несколько меньше символов, но не очень полезно в долгосрочной перспективе (за исключением, если вы хотите использовать автоматически с помощью правой преобразования SAS, но это кажется маловероятным здесь).

В противном случае нет прямого способа сделать то, что вы хотите, используя формат/informat - вы должны либо иметь символ слева, либо символ с правой стороны (или и то и другое), вы не можете использовать числовое числовое значение. Это потому, что это более или менее чит: SAS не создавал форматы/информацию с целью их использования таким образом, это просто удобный способ сделать это, чтобы использовать число в/из преобразования символов.

Существуют всевозможные способы сделать это, которые не используют формат/информацию, если вы предпочитаете. Хэш-таблица - это та же самая работа, которую нужно настроить, и примерно так же быстро (в некоторых случаях быстрее, в некоторых нет, ограничено размером памяти).

data eg2atptnum; 
    input egtptnum atptnum; 
    datalines; 
    1 0 
    2 2 
    3 4 
    4 6 
    5 8 
    6 24 
    ;;;; 
run; 

data _null_; 
    if _n_=1 then do; 
    if 0 then set eg2atptnum; 
    declare hash eg2at(dataset:'eg2atptnum'); 
    eg2at.defineKey('egtptnum'); 
    eg2at.defineData('atptnum'); 
    eg2at.defineDone(); 
    end; 
    egtptnum=4; 
    eg2at.find(); 
    put atptnum=; 
run; 
0

Не знаете, что здесь делают функции vvaluex и mod. Комбинация input/putn работает со значением формата.

proc format; 
value eg2atptnum 
    1 = 0 
    2 = 2 
    3 = 4 
    4 = 6 
    5 = 8 
    6 = 24; 

run; 

data have; 
do i=1 to 6; 
j=input(putn(i, 'eg2atptnum'),8.); 
output; 
end; 
run; 
+0

Почему 'putn' лучше или отличается от' put' здесь? Не похоже, чтобы указать тип во время выполнения, особенно интересно. – Joe

+0

@Joe Это другое ... просто прошел тест против 10 м общ, и он последовательно примерно в 4 раза медленнее. Если у вас много заявлений, и тонны наблюдений (или много циклов макросов), это не будет иметь большого значения. –

+0

@RobertPenridge Я не думал об этом, но это хороший момент. – Joe

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