首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >每个变量的SAS查找

每个变量的SAS查找
EN

Stack Overflow用户
提问于 2019-06-20 04:22:59
回答 2查看 49关注 0票数 2

我在SAS中有两个表,表A和表B。假设我想编写一些SAS代码来获得表“期望的输出”。我该怎么做呢?

表A:

代码语言:javascript
复制
Observation  Var1   Var2
1            0      0
2            1      2
3            2      1
4            0      0

表B:

代码语言:javascript
复制
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

所需输出:

代码语言:javascript
复制
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,但我不确定。我不知道该怎么做。伪代码可能看起来像这样,但我不知道如何让它真正工作:

代码语言:javascript
复制
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中实现所需的输出?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-20 08:33:10

下面是一个使用散列对象来存储表B的方法。

代码语言:javascript
复制
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;
票数 1
EN

Stack Overflow用户

发布于 2019-06-20 05:02:17

有十几种方法可以做到这一点,但对于您所拥有的,最好的方法可能是从第二个数据集生成一个格式。

格式只是一个值和另一个值之间的关系,这正是您在这里所拥有的!使用PROC FORMAT上的CNTLIN选项从数据集(数据集B)创建关系,然后使用PUT应用它。(然后使用INPUT更改回数字-格式仅创建字符值。您不能在这里使用INFORMAT,因为它们只接受字符值作为输入。Number to number总是需要一个额外的步骤。)

您还可以使用哈希表查找,或者只使用一对数据步骤合并,或者键控set语句……有很多选项,还有SQL连接。但这里的格式将是最快和最容易编码的IMO。

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56675317

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档