楼主: wanzionline
6918 13

SAS数据补齐 [推广有奖]

11
可~乐 发表于 2013-3-13 15:13:14
  1. data test1;
  2. length var1 $ 100 var2 $ 100;
  3. informat  task_id yymmdd10. date yymmdd10.  var3 yymmdd10.;
  4. input task_id  date  var1 $ var2 $ var3;
  5. format task_id yymmdd10. date yymmdd10. var3 yymmdd10.;
  6. cards;
  7. 2007/10/31 2008/12/31 366010 6506263N200700425 2009/5/29
  8. 2009/10/31 2009/12/31 2316010 HO650720000200900021 2012/5/13
  9. 2011/2/28 2011/4/30 5882654 544126 2015/12/21
  10. 2011/2/28 2011/4/30 5882654 6441040 2015/12/21
  11. 2007/5/31 2007/7/31 593722 1028129 2008/1/31
  12. 2007/9/30 2007/12/31 593722 1028129 2008/1/11
  13. 2007/5/31 2007/7/31 593722 1028129 2007/12/8
  14. 2007/5/31 2007/7/31 593722 1028236 2007/11/12
  15. 2007/5/31 2007/12/31 593722 2023509 2007/9/25
  16. 2007/5/31 2007/7/31 593722 6054504 2007/10/9
  17. 2007/5/31 2007/7/31 593722 6054721 2007/10/10
  18. 2007/5/31 2007/7/31 593722 6054808 2007/10/11
  19. 2007/5/31 2007/7/31 593722 6058092 2007/10/26
  20. 2007/5/31 2007/8/31 593722 6060651 2007/11/8
  21. 2009/11/30 2010/1/31 593722 9500660 2012/12/31
  22. ;

  23. proc sort data=test1;
  24.         by var1 var2 task_id;
  25. run;

  26. /*先按var1+var2分组*/
  27. data test2;
  28.         set test1;
  29.         by var1 var2 ;
  30.         if lag(var2)^=var2 then group+1;
  31. run;

  32. /*根据最早时间和最晚时间补全中间的每个月份*/
  33. data test3;
  34.         number=intck('month','31may2007'd,'28feb2011'd);
  35.         do group=1 to 13;
  36.                 do i=1 to 46;
  37.                         task_id=intnx('month','30apr2007'd,i,'e');
  38.                 output;
  39.                 end;
  40.         end;
  41.         format task_id yymmdd10.;
  42.         drop i number;
  43. run;

  44. data test4;
  45.         merge  test2 test3;
  46.         by group task_id;
  47. run;

  48. /*取每一组的开始时间,以便过滤掉一些比每组的最早时间还早的数据*/
  49. proc sql noprint;
  50.         create table test5 as select
  51.         group,
  52.         min(task_id) as  task_id_old format=yymmdd10.
  53.         from test2
  54.         group by group;
  55. quit;

  56. data test6;
  57.         merge test4 test5;
  58.         by group;
  59.         if task_id>=task_id_old; /*滤掉一些比每组的最早时间还早的数据*/

  60.         length var1_new $ 100 var2_new $ 100;
  61.         retain date_new var1_new var2_new var3_new;
  62.                 array temp1(2) var1 var2;
  63.                 array temp2(2) $ var1_new var2_new;
  64.                 do i=1 to 2;
  65.                         if temp1(i)^="" then  temp2(i)=temp1(i);
  66.                 end;
  67.                 array temp3(2) date var3;
  68.                 array temp4(2) date_new  var3_new;
  69.                 do i=1 to 2;
  70.                         if temp3(i)^=. then  temp4(i)=temp3(i);
  71.                 end;
  72.         drop i date  var1 var2  var3 task_id_old;
  73.         format date_new yymmdd10. var3_new yymmdd10.;
  74.         rename date_new=date var1_new=var1 var2_new=var2 var3_new=var3;
  75. run;
复制代码
已有 1 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
webgu + 60 + 60 + 3 + 3 + 3 question killer!

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

12
wanzionline 发表于 2013-3-13 16:45:48
可~乐 发表于 2013-3-13 15:13
谢谢啊,我晚上回去试试。我发了一个悬赏帖,您最好找找,50金币哦!!!!

13
wanzionline 发表于 2013-3-14 21:54:19
可~乐 发表于 2013-3-13 15:13
不好意思,昨晚家中有事,没来的及上网。
十分的感谢您的帮助,我已经基本上理解您的思路了,估计只需要改一改就可以使用了。
太感谢了,呵呵!

14
可~乐 发表于 2013-3-14 23:48:13
wanzionline 发表于 2013-3-14 21:54
不好意思,昨晚家中有事,没来的及上网。
十分的感谢您的帮助,我已经基本上理解您的思路了,估计只需要 ...

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-31 17:29