Sas 计算字符串分数

Sas 计算字符串分数,sas,Sas,假设我有以下数据集: 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_

假设我有以下数据集:

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]

像下面这样使用扫描和输入应该可以工作

 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;

我将这样做,以使结果是数字,而不是在单个步骤中通过RESOLVE使用%SYSEVALF时发生的字符转换

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;

这是使用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

我认为最简单的方法是将分数值放入宏变量中,调用其上的
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\u null\u的答案做同样的事情,只是在一行中。

很好地使用
输入(扫描,很可能比跳转到宏来解决每一个代码> Frace<代码> ValueGooToT!<代码> CueSeCs<代码>默认为分母到<代码> 1代码>代码> <代码> Frace<代码>没有它自己。考虑使用一种表示格式,而不是用“代码> PoT < /代码>转换为字符串,即<代码> Fracvay= S。can(压裂,1)/联合(扫描(压裂,2),1);格式化压裂4.2;
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;