我在SAS中有两个表,表A和表B。假设我想编写一些SAS代码以获得表“所需的输出”。我该怎么办?
表A:
Observation Var1 Var2
1 0 0
2 1 2
3 2 1
4 0 0
表B:
Var Level Lookup
Var1 0 0.1
Var1 1 0.3
Var1 2 0.5
Var2 0 0.7
Var2 1 0.8
Var2 2 0.9
所需的输出:
Observation Var1 Var2 Var1_new Var2_new
1 0 0 0.1 0.7
2 1 2 0.3 0.9
3 2 1 0.5 0.8
4 0 2 0.1 0.9
据我了解,这可能涉及SAS中的SQL,但我不确定。我不知道该怎么做。伪代码可能看起来像这样,但我不知道该如何使其真正起作用:
data DATA_OUT.DESIRED_OUTPUT;
set DATA_IN.TABLE_A;
set PP.TABLE_B key=(Var Level);
Var1_new = TABLE_B["Var1" Var1][Lookup];
Var2_new = TABLE_B["Var2" Var2][Lookup];
run;
您将如何在SAS中获得所需的输出?
答案 0 :(得分:1)
大约有十二种方法可以执行此操作,但是最好的方法可能是从第二个数据集中创建格式。
格式只是一个值和另一个值之间的关系,这正是您在这里拥有的!您可以在PROC FORMAT上使用CNTLIN选项从数据集(您的数据集B)创建关系,然后使用PUT应用它。 (然后使用INPUT更改回数字-格式仅创建字符值。此处不能使用INFORMAT,因为这些格式仅将字符值作为输入。数字到数字始终需要执行额外的步骤。)
您还可以使用哈希表查找,或者仅执行一对数据步骤合并,或使用键集语句...许多选项以及SQL连接。但是这里的格式将是最快且最容易编写IMO的代码。
data a;
input Observation Var1 Var2;
datalines;
1 0 0
2 1 2
3 2 1
4 0 0
;;;;
run;
data b;
input Var $ Level Lookup;
datalines;
Var1 0 0.1
Var1 1 0.3
Var1 2 0.5
Var2 0 0.7
Var2 1 0.8
Var2 2 0.9
;;;;
run;
*Here we make a new dataset that has the required names for a format cntlin dataset;
data for_fmt;
set b;
rename var=fmtname
level=start
lookup=label
;
var = cats(var,'F'); *format names cannot end with numbers, so add an F at the end;
run;
proc format cntlin=for_fmt; *read in the format;
quit;
*now use the formats;
data want;
set a;
var1_new = input(put(var1,var1f.),best12.);
var2_new = input(put(var2,var2f.),best12.);
run;
答案 1 :(得分:1)
这是使用哈希对象存储表B的方法。
data A ;
input var1 var2;
cards;
0 0
1 2
2 1
0 0
;
data B;
input Var :$32. Level Lookup;
cards;
Var1 0 0.1
Var1 1 0.3
Var1 2 0.5
Var2 0 0.7
Var2 1 0.8
Var2 2 0.9
;
data want;
if _n_=1 then do;
if 0 then set b;
dcl hash h(dataset: 'b');
h.definekey('var','level');
h.definedata('lookup');
h.definedone();
end;
set a;
h.find(key:'Var1',key:var1);
lookup1=lookup;
h.find(key:'Var2',key:var2);
lookup2=lookup;
drop var level lookup;
run;