使用格式将数字设为数字

时间:2015-01-17 17:41:25

标签: sas

我想用一个简单的转换表来转换一个值,如下所示:

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

input()需要输入字符。 是否有比atptnum=input(put(mod(egtptnum,10),best.),eg2atptnum.);更简单的方法来避免隐式类型转换?

atptnumegtptnum都是数字。

2 个答案:

答案 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;