楼主: tangliang0905
1702 2

关于上下数据合并的问题 [推广有奖]

  • 1关注
  • 3粉丝

讲师

52%

还不是VIP/贵宾

-

威望
0
论坛币
1137 个
通用积分
0.5583
学术水平
13 点
热心指数
20 点
信用等级
11 点
经验
30311 点
帖子
212
精华
0
在线时间
836 小时
注册时间
2012-11-29
最后登录
2024-7-23

楼主
tangliang0905 发表于 2013-3-18 15:06:28 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
有这样一个数据,
Code        BeginDate        EndDate
001        08/15/1981        08/18/2007
001        12/10/2007        09/30/2009
001        10/01/2009        12/31/2014
002        08/15/1981        08/18/2007
002        12/10/2007        09/30/2009
003        08/15/1981        08/18/2007
003        12/10/2007        09/30/2009
003        10/01/2009        12/31/2014
004        08/15/1981      08/18/2007
004        12/10/2007        09/30/2009
004        10/01/2009        12/31/2014
005        08/15/1981        12/09/2007
005        12/10/2007        09/30/2009
005        10/01/2009        12/31/2014

我在想如何在同一个code下,把begin date 和enddate尽可能的合并在一起,举例来说,如果在code 001中,第二个时间07年12月10号至09年9月30号,与第三个时间09年10月1号至14年12月31号,他们其实是连续的,所以合并成为从07年12月10号至14年12月31号,这样001只剩下两个观测量。
又比如005中,从81年8月15日一直到14年12月31日一直都是连续的,所以最后005只会剩下一个观测量81年8月15日到14年12月31日。


我一开始的做法是比较begin date和lag(end date)+1的区别,如果相等,就把begin date赋值成为lag(enddate)+1,但是这样只能执行一步,像005中这种情况就不行了,所以想请大家探讨一下,多谢指点。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:数据合并 begin date code 举例来说

沙发
pobel 在职认证  发表于 2013-3-18 15:50:47
data test;
  input code $        BeginDate :mmddyy10.      EndDate : mmddyy10.;
  format begindate enddate mmddyy10.;
  cards;
001        08/15/1981        08/18/2007
001        12/10/2007        09/30/2009
001        10/01/2009        12/31/2014
002        08/15/1981        08/18/2007
002        12/10/2007        09/30/2009
003        08/15/1981        08/18/2007
003        12/10/2007        09/30/2009
003        10/01/2009        12/31/2014
004        08/15/1981      08/18/2007
004        12/10/2007        09/30/2009
004        10/01/2009        12/31/2014
005        08/15/1981        12/09/2007
005        12/10/2007        09/30/2009
005        10/01/2009        12/31/2014
;

data wanted (rename=(_begin=begindate _end=enddate));
        retain _begin _end;
        format _begin _end mmddyy10.;
        do until(flag=1);
            set test;
                by code begindate;
                if first.code then do; _begin=begindate; _end=enddate; end;
                if begindate-_end=1 then _end=enddate;
        if begindate-_end>1 or last.code then flag=1;
    end;
        output;
        if last.code and enddate ne _end then do;
          _begin=begindate; _end=enddate; output;
        end;
        _begin=begindate; _end=enddate;

        keep code _begin _end;
run;
已有 2 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
tangliang0905 + 1 + 1 + 1 多谢指点
webgu + 60 + 60 + 3 + 3 + 3 一个DATA步搞定的强大!

总评分: 经验 + 60  论坛币 + 60  学术水平 + 4  热心指数 + 4  信用等级 + 4   查看全部评分

和谐拯救危机

藤椅
webgu 发表于 2013-3-18 16:01:27
data have;
input Code   BeginDate : mmddyy10.     EndDate : mmddyy10.;
format   BeginDate mmddyy10.       EndDate  mmddyy10.;
datalines;
001        08/15/1981        08/18/2007
001        12/10/2007        09/30/2009
001        10/01/2009        12/31/2014
002        08/15/1981        08/18/2007
002        12/10/2007        09/30/2009
003        08/15/1981        08/18/2007
003        12/10/2007        09/30/2009
003        10/01/2009        12/31/2014
004        08/15/1981       08/18/2007
004        12/10/2007        09/30/2009
004        10/01/2009        12/31/2014
005        08/15/1981        12/09/2007
005        12/10/2007        09/30/2009
005        10/01/2009        12/31/2014
;

data  tmp;
  set have;
  by code notsorted;
LagBeg=lag(BeginDate);
LagEnd=lag(EndDate);
if  first.code then  call missing(LagBeg,LagEnd )  ;
if  BeginDate=LagEnd+1 then NewBeginDate=LagBeg;
LagNewBeginDate=lag(NewBeginDate);
run;

data want(keep=code BeginDate EndDate);
  set tmp;
  by code;
if  (not first.code ) and  (not missing(coalesce(LagNewBeginDate,NewBeginDate) ))  then BeginDate=coalesce(LagNewBeginDate,NewBeginDate);
run;

proc sort data=want  nodupkey;
     by code BeginDate;
run;
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
tangliang0905 + 1 + 1 + 1 thanks a lot

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

SAS资源
1. SAS 微信:StatsThinking
2. SAS QQ群:348941365

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-2-1 03:15