SAS Vlookup в той же таблице - PullRequest
0 голосов
/ 28 ноября 2018

Мой случай находит значение в этой же таблице (для Variable2 из Value).Вы можете мне помочь?Мне нужен код 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 голосов
/ 28 ноября 2018

Итак, вы хотите взять значение 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 = dataset.

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

Если вам нужен более эффективный метод, вы можете использовать объект HASH шага данных.Вы можете загрузить пары переменная / значение в хеш, а затем использовать метод 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;
0 голосов
/ 28 ноября 2018

код ниже должен работать для вашего сценария.Я проверил несколько крайних сценариев, и все работает как положено.Просто проверьте еще раз, если это не удается какой-либо крайний случай, кроме этого

 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
 ;
...