首页 > 解决方案 > SAS 从存档中查找去年的数据

问题描述

美好的一天,我正在查看保单档案,并希望创建一个变量(列)来显示 1 年前的保单价格

每个保单都有一个保单 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          .     

因为 Policy ID 2 是续订,所以它确实有去年的数据。我是 SAS 新手,不知道如何编写代码。我正在考虑将whereifcontains结合使用,但我不确定这是一个选项。我可以使用创建变量的标准方式吗?

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

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

标签: sas

解决方案


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 的记录。如果 1 年内有更多续订,您将只有 LYPremiumXX 中的最后一个值...您可以使用宏使其更具动态...


推荐阅读