Оценить дробную строку - PullRequest
0 голосов
/ 16 ноября 2018

Предположим, у меня есть следующий набор данных:

data df;
input frac $;
datalines;
1/3
1/4
5/12
1
0
7/12
;
run;

И я хочу добраться до этого:

frac
0.33
0.25
0.42
1.00
0.00
0.58

Я знаю, что могу получить этот вывод, выполнив это:

proc sql;
select
  case
    when frac = '1/12' then 0.083
    when frac = '1/6' then 0.167
    ...
  end as frac_as_num
from df
;
quit;

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

frac = ['1/12', '1/6', ...]
[eval(f) for f in frac]

Ответы [ 4 ]

0 голосов
/ 16 ноября 2018
data df;
input frac $;
_frac=put(scan(frac,1)/coalesce(scan(frac,2),1),4.2);
datalines;
1/3
1/4
5/12
1
0
7/12
;
run;
0 голосов
/ 16 ноября 2018

Я бы так сделал, чтобы результаты были числами и не были преобразованы в и из символов, что произойдет, если вы используете% SYSEVALF через RESOLVE за один шаг.

filename FT76F001 temp;
data _null_;
   file FT76F001;
   input frac $;
   put +3 'x=' frac ';' frac=$quote. '; output;';
   datalines;
1/3
1/4
5/12
1
0
7/12
;
run;

data frac;
   length x 8 frac $16;
   %inc FT76F001;
   run;
proc print;
   run;

enter image description here

Используется SYSEVALF

464  data _null_;
465     input frac $;
466     x = input(resolve(cats('%sysevalf(',frac,')')),f32.);
467     put 'NOTE: ' (_all_)(=);
468     datalines;

NOTE: frac=1/3 x=0.3333333333
NOTE: frac=1/4 x=0.25
NOTE: frac=5/12 x=0.4166666667
NOTE: frac=1 x=1
NOTE: frac=0 x=0
NOTE: frac=7/12 x=0.5833333333
0 голосов
/ 16 ноября 2018

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

Что-то вроде:

data test;
    set df;

    call symput('myMacroVariable',frac);            /* Put the value of frac into a macro variable */
    dec = resolve('%sysevalf(&myMacroVariable)');   /* Evaluate the value of the macro variable */
run;

Редактировать: Не слушайте меня, ответ data_null_ делает то же самое, но в одной строке.

0 голосов
/ 16 ноября 2018

что-то вроде ниже с использованием сканирования и ввода должно работать.

 proc sql;
 create table want as 
 select frac, 
    case when index(frac,'/') then 
    input(scan(frac, 1),best32.)/input(scan(frac, 2),best32.) 
    else input(frac,best32.) end as frac_as_num format= 5.2
from df;
...