全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
3929 13
2014-09-01
想用循环找出同一个ID中state=5及其之后的一条记录。

请问如何设置该循环的第一步:使在同一个ID中循环?


data c;
  informat date1 yymmdd10.;
  format date1 yymmdd10.;
  input id $16. state yesno date1 ;
cards;
abcdefehhheehehe               1               1    2012-03-08
abcdefehhheehehe               1               1    2012-04-09
abcdefehhheehehe               1               1    2012-06-07
abcdefehhheehehe               1               1    2012-08-10
abcdefehhheehehe               1               1    2012-10-12
abcdefehhheehehe               5               1    2013-02-04
abcdefehhheehehe               1               1    2013-02-22
abcdefehhheehehe               1               1    2013-04-17
abcdefehhheehehe               1               1    2013-07-01
abcdefehhheehehe               1               1    2013-10-14
;
run;

二维码

扫码加我 拉你入群

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

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

全部回复
2014-9-1 19:16:36
不用DO循环就可以实现:
proc sort data=c;
        by id;
run;

data c1;
        set c;
        by id;
        retain y;
        if state=5 then y+1;
        if y>0;
run;

你看一下是不是你想要的结果?
       
二维码

扫码加我 拉你入群

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

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

2014-9-2 07:35:12
huangpengfei 发表于 2014-9-1 19:16
不用DO循环就可以实现:
proc sort data=c;
        by id;
谢谢!

不是。

我没说清楚:
同一个ID要保留state=5的date1及state=5之后的第一条记录的date1,
最终要比较state=5及之后的第一条记录的date之间的时间间隔.

另外数据量比较大,
state=5只是其中一个小分类,
还想知道这种处理有没有有效的算法或者好的思路?或者说把同一个ID的纵向数据中不同条件下如何变成横向?
二维码

扫码加我 拉你入群

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

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

2014-9-2 08:46:24
data d;
   set c;
   if state=5
      or (lag(state)=5 and id=lag(id));
run;
二维码

扫码加我 拉你入群

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

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

2014-9-2 09:52:11
pobel 发表于 2014-9-2 08:46
data d;
   set c;
   if state=5
tks!

lag()用法正适合。特别是 id=lag(id) 这个限制,很漂亮。

如果想保留state=5观察,同时生成一个新变量date5,使date5的值与将d数据集中state=1的date1的值相等即(date5=2013-02-22),有不想用first.id & last.id,该如何处理?
最终数据集为:
abcdefehhheehehe               5               1    2013-02-04  2013-02-22



*************************************;
如果想保留state=5之后所有state=1的观察中的最后一条记录,这个条件又该如何写?
或者类似的思路(算法)是否可以提示?

二维码

扫码加我 拉你入群

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

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

2014-9-2 10:57:44
priss111 发表于 2014-9-2 09:52
tks!

lag()用法正适合。特别是 id=lag(id) 这个限制,很漂亮。
data d;
   set c;
   retain _state _yesno _date1;
   if state=5 then do;
      _state=state; _yesno=yesno; _date1=date1;
        end;
   if (lag(state)=5 and id=lag(id));
   date5=date1;
   state=_state;
   yesno=_yesno;
   date1=_date1;
   drop _:;
run;
二维码

扫码加我 拉你入群

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

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

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群