SAS从存档中查找去年数据

时间:2018-08-07 11:39:29

标签: sas

早上好,我正在浏览政策档案,并想要创建一个变量(列),以显示一年前的政策价格

每个策略都有一个策略ID,存档中有每个策略(包括续订)。因此,同一策略ID可以在归档中出现多次,但每隔一列具有不同的值。例如,说我有这个

Policy_ID  Start_Date   End_Date   Premium  LYPremium15   LYPremium16  
1          01/01/2015  31/12/2015   500      .            .             
2          04/03/2015  03/03/2016   450      .            .             
3          03/02/2015  02/02/2016   600      .            .             
4          07/04/2015  06/04/2016   470      .            .             
5          01/01/2015  31/12/2015   500      .            .             
2          04/03/2016  03/03/2017   510      .            .             

我想用上一年的溢价填充LYPremium15,LYPremium16,LYPremium17列。所以看起来像这样,

Policy_ID  Start_Date   End_Date   Premium  LYPremium15   LYPremium16  
1          01/01/2015  31/12/2015   500      .            .             
2          04/03/2015  03/03/2016   450      .            .             
3          03/02/2015  02/02/2016   600      .            .             
4          07/04/2015  06/04/2016   470      .            .             
5          01/01/2015  31/12/2015   500      .            .             
2          04/03/2016  03/03/2017   510      450          .     

因为策略ID 2是续订,所以它确实有去年的数据。 我是SAS的新手,不确定如何编写此代码。我正在考虑将其中 if 包含结合使用,但是我不确定这是一个选择。 我可以使用创建变量的标准方法吗?

data mylib.van_LYprem;
set mylib.van_combined_total;
LYPrem15=...;
run;

还是我必须以更高级的方式来解决这个问题?

1 个答案:

答案 0 :(得分:1)

SAS将按记录处理您的数据集记录。因此,您必须保留旧的年份值。

我认为开始日期决定了年份。 如果我们像这样对数据集进行排序:

proc sort data=work.van_combined_total;
  by Policy_ID start_date;
run;

我们可以使用by语句并保留值;

data work.van_LYprem;
  set work.van_combined_total;
  by Policy_ID start_date;

  retain LYPrem15 LYPrem16 LYPrem17;

    if (first.Policy_ID) then do;
       LYPrem15=.;
       LYPrem16=.;
       LYPrem17=.;
    end;

    output;

    if(year(start_date) eq 2015) then do;
         LYPrem15=Premium;
    end;
    if(year(start_date) eq 2016) then do;
        LYPrem16=Premium;
    end;
    if(year(start_date) eq 2017) then do;
        LYPrem17=Premium;
    end;     

run;

此后,您将获得带有premium和LYPremiumXX的记录。如果一年内有更多续订,您将只有LYPremiumXX中的最后一个值... 您可以使用宏的...使它更具动态性。