如何使用哈希表和数组创建查找表?

时间:2019-04-20 10:58:08

标签: sas hashtable

问题在于计算最低费用。我有一个名为busfares的数据集,其中包含不同的车站代码,车站代码,票价类型。如果您想在我的问题上花些时间,非常感谢大家。

数据集看起来像这样

srt_na srt srt_id dest_na dest dest_id adult_pri student_pri child_pri eldery_pri
abcde  abc  1     abcde    abc   1        0       0           0         0
abcde  abc  1     bbcde    bbc   2        5       4           4         1
abcde  abc  1     cbcde    cbc   3        7       5           5         1
abcde  abc  1     dbcde    dbc   4        7       5           5         1
abcde  abc  1     ebcde    ebc   5        10      6           6         1
                                  .
                                  .
                                  .
abcde  abc  1     ooooo    ooo   91       30.5    20          20        1
bbcde  bbc  2     abcde    abc    1       5       4           4         1
bbcde  bbc  2     bbcde    bbc    2       0       0           0         0
                                  .
                                  .
                                  .
ooooo  ooo  91    abcde    abc    1       30.5    20          20        1
ooooo  ooo  91    bbcde    bbc    2       30.5    20          20        1
                                  .
                                  .
                                  .
ooooo  ooo  91    ooooo    ooo    91      0       0           0         0

第一个问题是如何使用看起来像这样的哈希对象建立查询表:

srt  srt_na srt_id
abc   abcde   1
bbc   bbcde   2
cbc   cbcde   3
dbc   dbcde   4
ebc   ebcde   5

第二个问题是如何使用四个数组来组合不同票价类型的查询表?该表应如下所示。并且行和列代表不同的工作站名称,例如row1代表abc,column1也代表abc。

adult   1   2   3   4   ...
1       0   5   7   7   ...
2       5   0   10  10  ...
3       7   10  0   5   ...
4       7   10  5   0   ...

2 个答案:

答案 0 :(得分:0)

实际上,最好使原始表更高和更窄。而是将多个票价类型列转换为多行。例如,您可以创建fare_type(具有“成人”等值)和fare。

您可以使用PROC TRANSPOSE转换当前数据集。

proc transpose data=lookup name=fare_type out=lookup2(rename=(col1=fare));
  by srt_na dest_na srt_id dest_id notsorted ;
  var adult_pri student_pri ;
run;

因此,如果您的客户数据如下:

data cust ;
  input cust srt_na :$8. dest_na :$8. fare_type :$32. ;
cards;
1 aaa bbb adult_pri
2 bbb ccc student_pri
;

然后,您可以通过将客户请求数据与车站,车站和票价类型上的票价数据进行匹配来计算票价。

proc sql;
   create table want as 
      select a.*,b.fare 
      from cust a
      left join lookup2 b
      on a.str_na = b.str_na and a.dest_na = b.dest_na
      and a.fare_type = b.fare_type
   ;
quit;

如果您确实想创建一个哈希对象,则可以使用该哈希对象来查找价格,而无需使用array(matrix)。同样,最好使查询表更高。

data want;
  set cust;
  fare=.;
  if _n_=1 then do;
    declare hash h(dataset:'lookup2');
    h.definekey('srt_na','dest_na','fare_type'); 
    h.definedata('fare');
    h.definedone();
  end;
  h.find();
run;

答案 1 :(得分:0)

非常感谢您的回答。但是,使用转置不会将数据集变成我想要的“更宽”的数据集。

fare 1  2  3  4  5  6  7  8  9  10  11  12  13  14  15
1
2

如您所见,新的查找表比91x91数组表更好。而每个框内的数字就是票价。