sas 从 table 加载数组

sas load array from table

我需要将二维数组从 table 加载到 SAS 数据步骤,然后使用它在另一个 table 中执行变量转换。该数组看起来像这样:

1 1 2 3 2 2 2 3 3 4 4 4 4 4 5 6

到目前为止,我已将数组硬编码为 sas 代码: data example; array lookup {4,4} _temporary_ 1 1 2 3 2 2 2 3 3 4 4 4 4 4 5 6 ; set source(keep=(value years)); value_final = lookup{value, years}; run;

如何在不对矩阵进行硬编码的情况下做同样的事情,而是将 table 加载到数据步骤中并用作数组?

我会将查找 table 放入包含年份和值的数据集中。然后将其加载到关联数组中。

data lookup;
   do value = 1 to 4;
      do years = 1 to 4;
         input value_final @;
         output;
         end;
      end;
   cards;
1 1 2 3 
2 2 2 3 
3 4 4 4 
4 4 5 6
;;;;
   run;
proc print;
   run;
data source;
   input years value @@;
   cards;
3 2  4 1 5 0  2 2
;;;;
   run;

data example;
   if _n_ eq 1 then do;
      if 0 then set lookup;
      declare hash lookup(dataset:'lookup');
      lookup.definekey('value','years');
      lookup.definedata('value_final');
      lookup.definedone();
      end;
   set source;
   if lookup.find() ne 0 then call missing(value_final);
   run;
proc print;
   run;

你可以加载到数组中,但它有点笨拙,你必须知道维度。而且你必须检查我没有做的超出范围的下标。

data lookup;
   do value = 1 to 4;
      do years = 1 to 4;
         input value_final @;
         output;
         end;
      end;
   cards;
1 1 2 3 
2 2 2 3 
3 4 4 4 
4 4 5 6
;;;;
   run;
proc print;
   run;
data source;
   input years value @@;
   cards;
3 2  4 1 2 2
;;;;
   run;

data example;
   array lookup[4,4] _temporary_;
   if _n_ eq 1 then do;
      do while(not eof);
         set lookup end=eof;
         lookup[value,years]=value_final;
         end;
      end;
   set source;
   value_final=lookup[value,years];
   run;
proc print;
   run;