создать переменную из двух данных SAS - PullRequest
0 голосов
/ 18 октября 2018

Я новичок в SAS, и у меня есть два набора данных, которые выглядят следующим образом:

   A                                        B 
ID  Column1  Column 2  Column 4          ID  Column2   Column3 
1      A     carrot    food              1   carrot    veggie
1      B     carrot    drink             2   pear      fruit
2      A     pear      food              3   apple     fruit 
2      B     pear      drink

Я хотел бы создать новую переменную с именем 'Column3' в A, которая использует следующую логику:

If Column1 = A in dataset A, then set to Column3 from dataset B, otherwise set to Column4 in dataset A. 

   A                                         
ID  Column1  Column 2  Column 4   Column 3        
1      A     carrot    food       veggie         
1      B     carrot    drink      drink       
2      A     pear      food       fruit        
2      B     pear      drink      drink

Код, который я думаю, будет работать:

DATA A;
    SET DF.A; 
    if (Column1 = A) then Column3 = [Column3 from B which I may have to merge];
else Column3 = Column4;
RUN;
PROC PRINT DATA = A; 
    TITLE 'OUTPUT DATASET'; 
RUN; 

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Итак, сначала объедините два набора данных, чтобы иметь доступ к значениям из другого набора данных.Затем вы можете использовать условную логику, чтобы выбрать, какую переменную использовать для заполнения новой переменной.Вы захотите использовать переменную NEW вместо того, чтобы просто использовать переменную, которую вы извлекаете из B. Если имеется много наблюдений в A, соответствующих только одному наблюдению в B, SAS не изменит значения столбца 3 до тех пор, покаНеобходимо прочитать новое наблюдение из B.

data want ;
  merge A B (keep=column2 column3);
  by column2 ;
  if column1 = 'A' then new_column3=column3;
  else new_column3=column4;
run;

Обратите внимание, что оба набора данных должны быть отсортированы, чтобы их можно было объединить.

Я добавил опцию набора данных KEEP=, потому что вы указали оба набора данных как имеющие общий неключевой идентификатор переменной.Отсутствие идентификатора в списке переменных, считываемых из B, предотвратит перезапись его значений переменной с аналогичным именем из набора данных A.

0 голосов
/ 18 октября 2018

вы можете использовать простое внутреннее объединение, как показано ниже.

  data have1;                                    
  input ID  Column1 $ Column2 $ Column4 $;   
 datalines;     
  1      A     carrot    food             
  1      B     carrot    drink            
  2      A     pear      food              
  2      B     pear      drink
  ;

data have2;
    input ID  Column2 $ Column3 $;
   datalines;
  1   carrot    veggie
  2   pear      fruit
  3   apple     fruit 
  ;

proc sql;
create table want as 
select a.id,
   a.column1,
   a.column2,
   a.column4, 
   case when trim(a.column1)= "A" 
       then b.column3 
       else a.column4
   end as column3
 from have1 a
 inner join 
 have2 b
 on a.id =b.id;

, если вы хотите в шаге данных использовать слияние и использовать оператор if.

proc sort data =have1;
by id;
run;

proc sort data =have2;
 by id;
 run;

 data want;
 merge have1(in=a) have2(in=b drop=column2);
 by id;
if a= 1 and b=1;
if trim(column1)= "A" then column3=column3;
else column3=column4;
run;

или вы также можете использовать хеш.

data want;
if _n_ =1 then do;
 if _n_ = 0 then set have1 have2;
dcl hash h(multidata:"Y", dataset:"have2(drop=column2)");
h.definekey("id");
h.definedata( "column3");
h.definedone();
end;
set have1;
if h.find() = 0 then do until (h.find_next() ne 0);
end;
if trim(column1)= "A" then column3=column3;
else column3=column4;
run;
...