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;