首页 > 解决方案 > 满足条件时按组跳转到下一个

问题描述

我有一个文件记录婚姻状况的变化——身份证、变化类型(结婚、离婚、丧偶)和变化的年份(和月份)。我想计算任何给定年份的每个人的婚姻状况(已婚、离婚、寡妇(呃)、从未结婚)。由于一个人可以经历许多更改,而我的文件大约有 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 丧偶

提前致谢!

标签: sas

解决方案


如果跳过你的意思是不阅读它们,那么你不能“跳过”观察。但是您可以通过使用 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;

推荐阅读