具有格式的数字到数字

Numeric to numeric with a format

我想通过简单的转换 table 来转换一个值,如下所示:

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

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

atptnumegtptnum 都是数字。

不确定 vvaluex 和 mod 函数在这里做什么。 input/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;

如果您只是想避免警告,可以使用 cats 为您完成。不过这有点傻,因为它的工作量与 put 基本相同。

IE:

atptnum = input(cats(mod(egatptnum,10)),egatptnum.);

少了几个字符,但在长 运行 中没有真正帮助(除非你想使用 SAS 自动使用正确的转换,但这里似乎不太可能)。

否则没有直接的方法可以使用 format/informat 做你想做的事 - 你必须在左侧有字符或在右侧有字符(或两者),你不能从数字到数字.那是因为这或多或少是一种作弊:SAS 创建 formats/informats 并不是为了以这种方式使用它们,它只是一种利用数字 to/from 字符转换的便捷方式.

如果您愿意,有多种不使用 format/informat 的方法可以做到这一点。哈希 table 的设置工作大致相同,而且速度也差不多(在某些情况下更快,在某些情况下则不然,受内存大小限制)。

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;