我想用一个简单的转换表来转换一个值,如下所示:
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 :(得分:0)
不确定vvaluex和mod函数在这里做了什么。输入/ 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;
答案 1 :(得分:0)
如果您只是想避免警告,可以使用cats
为您执行此操作。但是,这有点愚蠢,因为它与put
的工作量基本相同。
IE:
atptnum = input(cats(mod(egatptnum,10)),egatptnum.);
少一些字符,但从长远来看并不是很有用(除非您想使用正确的转换自动使用SAS,但这似乎不太可能。)
否则没有直接的方法可以使用格式/信息来做你想做的事情 - 你必须要么在左侧有字符,要么在右边有字符(或两者都有),你不能将数字转换成数字。这是因为这或多或少是一种欺骗: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;