从两个数据SAS创建变量

时间:2018-10-18 18:18:08

标签: if-statement merge sas

我是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

我想在A中使用以下逻辑创建一个名为“ Column3”的新变量:

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 :(得分:1)

因此,首先合并两个数据集,以便您可以访问另一个数据集的值。然后,您可以使用条件逻辑来选择要使用哪个变量来填充新变量。您将要使用 NEW 变量,而不仅仅是使用从B中提取的变量。如果A中有很多观测值,而B中只有一个观测值,则SAS不会更改column3的值,直到它需要从B读取新的观察结果。

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

请注意,两个数据集都需要排序才能合并。

我添加了KEEP=数据集选项,因为您将两个数据集都列为具有共同的非键变量ID。从B读取的变量列表中不包括ID,将防止其值覆盖数据集A中类似命名的变量。

答案 1 :(得分:0)

您可以使用简单的内部联接,如下所示。

  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;

如果要在datastep中使用合并并使用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;