同一 table 中的 SAS Vlookup

SAS Vlookup in the same table

我的案例是在同一个 table 中寻找价值(对于来自 Value 的 Variable2)。你能帮助我吗?对于这种情况,我需要一个 SAS 代码。

我试过这样解决的:

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;  

下面的代码应该适用于您的场景。我已经检查了几个边缘案例场景并且它按预期工作。只要再次检查它是否失败了除此

之外的任何边缘情况
 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
 ;

所以您想获取 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 对象。您可以将 variable/Value 对加载到散列中,然后使用 FIND() 方法检查与 Variable2 关联的值。如果找到,则将该值复制到一个新变量中。请注意,您随后需要重新查找与 VARIABLE 关联的值,因为之前的 FIND() 将覆盖 VALUE。

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;