【问题标题】:SAS Lookup on Per Variable Basis基于每个变量的 SAS 查找
【发布时间】:2019-06-19 20:22:59
【问题描述】:

我在 SAS 中有两个表,表 A 和表 B。假设我想编写一点 SAS 代码来获取表“Desired Output”。我该怎么做?

表 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 中实现所需的输出?

【问题讨论】:

    标签: sql database dictionary sas key


    【解决方案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;
    

    【讨论】:

      【解决方案2】:

      大约有十几种方法可以做到这一点,但最好的方法可能是从第二个数据集制作格式。

      格式只是一个值和另一个值之间的关系,这正是您在这里所拥有的!您使用 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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-20
        • 2020-08-24
        • 1970-01-01
        • 1970-01-01
        • 2017-10-12
        相关资源
        最近更新 更多