楼主: liuliuqiu
746 1

[有偿编程] SAS程序求教 [推广有奖]

  • 6关注
  • 2粉丝

副教授

62%

还不是VIP/贵宾

-

威望
0
论坛币
2340 个
通用积分
8.9561
学术水平
3 点
热心指数
5 点
信用等级
5 点
经验
14393 点
帖子
429
精华
0
在线时间
1113 小时
注册时间
2009-3-24
最后登录
2024-2-29

10论坛币
有一组数据,含有个体(id)、日期(date)以及是否发生某事件(happen)三个变量,表示个体发生特定事件的日期。
想获取个体发生特定事件前某段时间的样本数据,例如事件发生(happen=1)时前100行到前30行的数据,求教如何编写SAS程序。例如下面的数据a,求取个体事件发生前10行到前3行的数据(若取不到前10行,则取到第一行就截止),谢谢!数据量比较大,所以没法手工筛选,只能求助软件。
iddatehappen

1

2001/1/1

0

1

2001/1/2

0

1

2001/1/3

0

1

2001/1/4

0

1

2001/1/5

0

1

2001/1/6

0

1

2001/1/7

0

1

2001/1/8

0

1

2001/1/9

0

1

2001/1/10

0

1

2001/1/11

0

1

2001/1/12

0

1

2001/1/13

1

1

2001/1/14

0

1

2001/1/15

0

1

2001/1/16

0

1

2001/1/17

0

1

2001/1/18

0

2

2003/3/2

0

2

2003/3/3

0

2

2003/3/4

0

2

2003/3/5

0

2

2003/3/6

0

2

2003/3/7

0

2

2003/3/8

0

2

2003/3/9

0

2

2003/3/10

0

2

2003/3/11

0

2

2003/3/12

0

2

2003/3/13

1

2

2003/3/14

0

2

2003/3/15

0

3

2002/8/2

0

3

2002/8/3

0

3

2002/8/4

0

3

2002/8/5

0

3

2002/8/6

0

3

2002/8/7

0

3

2002/8/8

0

3

2002/8/9

0

3

2002/8/10

0

3

2002/8/11

0

3

2002/8/12

0

3

2002/8/13

1

3

2002/8/14

0

3

2002/8/15

0

3

2002/8/16

0

得到数据:
iddatehappen

1

2001/1/1

0

1

2001/1/2

0

1

2001/1/3

0

1

2001/1/4

0

1

2001/1/5

0

1

2001/1/6

0

1

2001/1/7

0

1

2001/1/8

0

1

2001/1/9

0

1

2001/1/10

0

2

2003/3/2

0

2

2003/3/3

0

2

2003/3/4

0

2

2003/3/5

0

2

2003/3/6

0

2

2003/3/7

0

2

2003/3/8

0

2

2003/3/9

0

2

2003/3/10

0

3

2002/8/3

0

3

2002/8/4

0

3

2002/8/5

0

3

2002/8/6

0

3

2002/8/7

0

3

2002/8/8

0

3

2002/8/9

0

3

2002/8/10

0

3

2002/8/11

0

3

2002/8/12

0



最佳答案

孤单的我们 查看完整内容

问题描述和给出的示例前后矛盾,如果是到前三,那么id 2和3的结尾错误。参考附件代码,可根据需要修改判断index
关键词:sas程序 Happen date 样本数据 App
沙发
孤单的我们 发表于 2020-10-21 10:09:04 |只看作者 |坛友微信交流群
问题描述和给出的示例前后矛盾,如果是到前三,那么id 2和3的结尾错误。参考附件代码,可根据需要修改判断index
  1. data raw;
  2. length date $10;
  3. input id date$ happen;
  4. datalines;
  5. 1 2001/1/1 0
  6. 1 2001/1/2 0
  7. 1 2001/1/3 0
  8. 1 2001/1/4 0
  9. 1 2001/1/5 0
  10. 1 2001/1/6 0
  11. 1 2001/1/7 0
  12. 1 2001/1/8 0
  13. 1 2001/1/9 0
  14. 1 2001/1/10 0
  15. 1 2001/1/11 0
  16. 1 2001/1/12 0
  17. 1 2001/1/13 1
  18. 1 2001/1/14 0
  19. 1 2001/1/15 0
  20. 1 2001/1/16 0
  21. 1 2001/1/17 0
  22. 1 2001/1/18 0
  23. 2 2003/3/2 0
  24. 2 2003/3/3 0
  25. 2 2003/3/4 0
  26. 2 2003/3/5 0
  27. 2 2003/3/6 0
  28. 2 2003/3/7 0
  29. 2 2003/3/8 0
  30. 2 2003/3/9 0
  31. 2 2003/3/10 0
  32. 2 2003/3/11 0
  33. 2 2003/3/12 0
  34. 2 2003/3/13 1
  35. 2 2003/3/14 0
  36. 2 2003/3/15 0
  37. 3 2002/8/2 0
  38. 3 2002/8/3 0
  39. 3 2002/8/4 0
  40. 3 2002/8/5 0
  41. 3 2002/8/6 0
  42. 3 2002/8/7 0
  43. 3 2002/8/8 0
  44. 3 2002/8/9 0
  45. 3 2002/8/10 0
  46. 3 2002/8/11 0
  47. 3 2002/8/12 0
  48. 3 2002/8/13 1
  49. 3 2002/8/14 0
  50. 3 2002/8/15 0
  51. 3 2002/8/16 0
  52. ;
  53. run;

  54. data raw1;
  55.         set raw;
  56.         by id;
  57.         retain _in_id;
  58.         if first.id then _in_id=0;
  59.         _in_id+1;
  60. run;

  61. proc sql noprint;
  62.         create table raw2 as
  63.         select a.*,b._in_id as index from raw1 as a
  64.         left join (select id,min(_in_id) as _in_id from raw1 where happen=1 group by id) as b
  65.         on a.id eq b.id
  66.         order by id,_in_id;
  67. quit;

  68. data wanted;
  69.         set raw2;
  70.         if index>10 then do;
  71.                 if _in_id<=10 and _in_id<=index-3 then output;
  72.         end;
  73.         else do;
  74.                 if _in_id eq index-1 then output;
  75.         end;
  76. run;
复制代码
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
liuliuqiu + 5 + 5 + 5 精彩帖子

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

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-25 22:35