SAS Vlookup在同一表中

时间:2018-11-28 15:35:49

标签: sas sas-macro

我的情况是在同一张表中查找值(对于Value中的Variable2)。你能帮助我吗?在这种情况下,我需要SAS代码。

enter image description here

我试图解决这种问题:

data example2;                                                 
 input Variable Value Variable2;                                                  
    datalines;                                                    
    V1 3 V2 
    V2 6 V1 
    V3 4 V5 
    V4 1 V1 
    V5 5 V2 
    ;

    proc sort data=example2;
        by Variable;
    run;
    data example19;
      set example2;
      merge example2 example2 (keep=Value Variable2 rename=(Value=new));                             
    run;  

2 个答案:

答案 0 :(得分:1)

以下代码应适用于您的方案。我已经检查了几个极端情况,并且按预期工作。只需再次检查它是否在其他情况下失败

 data have;
  input variable $ value variable2 $;
  datalines;
  V1 3 V2
  V2 6 V1
  V3 4 V5
  V4 1 V1
  V5 5 V2
 ;


   proc sql;
  create table want as 
     select  a.variable ,a.value, a.variable2 ,   b.value as value2            
  from have a
  left join
  have b
  on  a.variable2 =b.variable
  order by variable;

proc sql;
 select * from want;

/* once edge case scenario where you do not have variable for variable2 it 
  works as expected giving a null value*/

data have1;
 input variable $ value variable2 $;
datalines;
V1 3 V2
V2 6 V1
 V3 4 V5
V4 1 V1
V5 5 V2
V9 8 V7
 ;

答案 1 :(得分:1)

因此,您想获取VARIABLE2的值并使用它来查找VARIABLE具有相同值的行吗?因此,要使用MERGE语句来完成此操作,您将需要按VARIABLE2的值进行合并。

因此,首先按VARIABLE2对数据进行排序。

proc sort data=example2;
  by Variable2;
run;

然后创建一个仅包含前两列的版本,但对其进行重命名,以使变量名称列匹配,但值列名称不会冲突。

proc sort data=example2 (keep=Value Variable rename=(Value=New Variable=Variable2))
   out=example2b
;
  by variable2;
run;

现在,您可以只合并两个表。但是,您只想保留原始的行集,因此请使用IN =数据集选项。

data want ;
   merge example2(in=in1) example2b;
   by variable2;
   if in1;
run;

如果要使用更有效的方法,可以使用数据步骤HASH对象进行研究。您可以将变量/值对加载到哈希中,然后使用FIND()方法检查与Variable2相关联的值。如果找到,则将值复制到新变量中。请注意,由于先前的FIND()将覆盖VALUE,因此您需要重新查找与VARIABLE相关的值。

data want ;
  set example2;
  if _n_=1 then do;
    declare hash h(dataset: 'example2');
    h.definekey('Variable');
    h.definedata('Value');
    h.definedone();
  end;
  if not h.find(key: Variable2) then new=value;
  h.find();
run;