sas - 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 新手,不知道如何编写代码。我正在考虑将where与if和contains结合使用,但我不确定这是一个选项。我可以使用创建变量的标准方式吗?
data mylib.van_LYprem;
set mylib.van_combined_total;
LYPrem15=...;
run;
还是我必须以更高级的方式解决这个问题?
解决方案
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 中的最后一个值...您可以使用宏使其更具动态...
推荐阅读
- python - Python - socket.gethostbyaddr() 在一台电脑上失败,但在另一台电脑上工作
- c++ - C++ 为什么在尝试读取表单文件并分离成不同的变量时会发生这种情况?
- sql-server - SQL Server Profiler 中的主机名和应用程序是什么意思
- php - 如何在 PHP 中将 cron 表达式从本地时区转换为 UTC
- ubuntu - 卷曲错误无法解决我的主机问题,但可以通过 google 解决
- javascript - UnhandledPromiseRejectionWarning:未处理的承诺拒绝 - API
- javascript - 按下输入时如何在标签上插入新行
- angular - 如何订阅 Angular 中路由参数的更改?
- php - 我想在整个 html 表单中获取 PHP 中的值
- python - 从列表中写入 csv 文件,但并非所有元素都跟进