sas - 满足条件时按组跳转到下一个
问题描述
我有一个文件记录婚姻状况的变化——身份证、变化类型(结婚、离婚、丧偶)和变化的年份(和月份)。我想计算任何给定年份的每个人的婚姻状况(已婚、离婚、寡妇(呃)、从未结婚)。由于一个人可以经历许多更改,而我的文件大约有 2000 万行,所以当我找到答案时,我想跳到下一个人,而不是继续浏览该人的所有其他记录。
我想按 ID 和更改日期降序排序,然后按 ID 设置。对于每个 ID,如果我感兴趣的年份大于(或等于)变化的年份,则计算婚姻状况并输出 ID 和婚姻状况。如果不是,则继续下一条记录,直到满足条件。如果没有符合条件的记录,则婚姻状况=从未结婚。
data a;
length type_change $10;
input ID type_change yr_change mnth_change;
cards;
1 marriage 2006 9
1 divorce 2010 5
10 marriage 2005 2
10 divorce 2012 10
10 marriage 2016 8
23 marriage 2017 6
35 marriage 2002 7
35 widow 2013 12
;
run;
对于 2015 年,我想获得: - ID marital_status - 1 离婚 - 10 离婚 - 23 从未结婚 - 35 丧偶
提前致谢!
解决方案
如果跳过你的意思是不阅读它们,那么你不能“跳过”观察。但是您可以通过使用 IF 语句(或其他条件逻辑)来忽略它们。
使用 RETAIN 和 BY 组处理应该可以得到答案。
%let year=2015;
data want ;
set a ;
by id yr_change mnth_change ;
length status $20;
retain status ;
if first.id then status='never been married ';
if yr_change <= &year then status=type_change ;
if last.id;
keep id status;
run;
结果:
Obs ID status
1 1 divorce
2 10 divorce
3 23 never been married
4 35 widow
如果您有权访问 ID 的主列表,则可以转换为使用 WHERE 语句,这可能会减少处理所有记录所需的 I/O。例如,将 ID 列表与婚姻状况更改记录的子集合并。
data want;
merge id_list a(in=in2 where=(yr_change <= &year));
by id;
length status $20;
retain status ;
if first.id then status='never been married ';
if in2 then status=type_change ;
if last.id;
keep id status;
run;
推荐阅读
- html - 在 HTML 中设置导入元素的样式
- python - 函数转换 Matlab 到 Python 的问题
- log4j - Log4j 2 自定义附加程序
- system-verilog - SymbiYosys如何通过Induction?
- javascript - 在 Element UI 复选框组中呈现列表
- arrays - Excel从具有多个条目的列表中随机选择名称,并填写每组行不重复名称多次的列
- sql - 我是否以正确的方式将此数据库标准化为 3NF 级别?
- c# - 当我尝试使用 C# 在 Oracle 数据库中使用占位符更新时间戳列时,应用程序冻结
- python-3.x - TypeError:“int”类型的对象在目标函数非线性优化 Gekko 中没有 len()
- mongodb - MongoDB 时间 小时和分钟的差异