问题在于计算最低费用。我有一个名为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 ...
答案 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数组表更好。而每个框内的数字就是票价。