SAS使用更新的数据修改和/或替换主数据

时间:2015-04-21 18:50:12

标签: replace merge append sas updates

我有两个数据集 - 需要使用单独数据集中包含的最新数据定期更新的主数据集。我一直在玩MODIFY语句,但我在完全替换数据组时遇到了麻烦。下面的代码创建了两个示例数据集:

data new;
    input year dqtr age yearq;
    datalines;
    2011    4   43  20114
    2011    4   25  20114
    2013    1   52  20131
    2013    1   45  20131
    2013    2   72  20132
    2013    2   43  20132
    2013    3   93  20133
    2013    3   97  20133
    2013    4   23  20134
    2013    4   37  20134
;
run;

data master;
    input year dqtr age yearq;
    datalines;
    2011    3   94  20113
    2011    3   76  20113
    2011    3   56  20113
    2011    4   43  20114
    2011    4   62  20114
    2011    4   73  20114
;
run;

变量YEARQ是YEAR和DQTR的连接变量。如果YEARQ组合不在主数据集中,则应附加它。如果它在主数据集内,则它应该替换整个组。例如,只有YEARQ = 20114应该在最终数据集中。应该用2个新的20114年障碍物替换3个原始的20114年障碍物。下面的代码几乎可以实现我想要的,但YEARQ的整个组都没有被替换(它只替换了第一次发现的那种组合的观察结果):

data master(index=(yearq)); 
    set master;
run;

data master;
    set new;
    modify master key=yearq;
   if _iorc_ =0 then replace;
   else do; 
         _error_=0;       
         _iorc_=0;  
      output;  
      end;
run;

1 个答案:

答案 0 :(得分:1)

在我看到您的update流程时,基本上您要做的就是关注

  1. 如果您的new数据集包含现有的yearq值,那么您要在master数据集中更新它,即从yearq删除所有常见的master并将新yearqnew追加到master
  2. 您还要将任何新的yearq附加到master数据集。

  3. 提取常见yearq

    proc sql;
    create table common as select distinct(a.yearq) from master as a, new as b
    where a.yearq=b.yearq;
    quit;
    

    从主人

    中删除常见的yearq
    proc sql;
    create table temp as select * from master where yearq not in(select yearq from common);
    quit;
    

    new数据集附加到master数据集

    data master;
    set temp
        new;
        run;