楼主: carol1222
2967 28

[问答] 本人新手,求高手指教 [推广有奖]

11
carol1222 发表于 2012-2-6 14:56:53
zhangzachary 发表于 2012-2-6 14:44
你想要的是什么样的结果?
比如,输入301(第301天),然后计算从第(301-26*7)天开始到第300天的spendin ...
你说得对,就是这个意思。
花有再开日 人无再少年

12
zhangzachary 发表于 2012-2-6 15:07:49
carol1222 发表于 2012-2-6 14:54
spending的值都有的,没有缺失值。如果缺失,当做0处理。
spending的值好处理,那么realday呢?是每天都有,还是说只需要将在301-26*7+2到300之间存在的realday值的spending加起来?虽然意思是差不多的,不过程序处理上会略有不同,所以请说明
寒冰凤凰 My blog: http://blog.sina.com.cn/u/1058955485

13
carol1222 发表于 2012-2-6 15:12:07
zhangzachary 发表于 2012-2-6 15:07
spending的值好处理,那么realday呢?是每天都有,还是说只需要将在301-26*7+2到300之间存在的realday值的 ...
不是每天都有的,就跟我给出的例子一样,只有某些天有值,比如10000501在27,187,201等有值,所以要有个判断,那些天是出于这个区间内的
花有再开日 人无再少年

14
carol1222 发表于 2012-2-6 15:22:35
zhangzachary 发表于 2012-2-6 15:07
spending的值好处理,那么realday呢?是每天都有,还是说只需要将在301-26*7+2到300之间存在的realday值的 ...
您有解了吗?
花有再开日 人无再少年

15
zhangzachary 发表于 2012-2-6 15:26:22
carol1222 发表于 2012-2-6 15:22
您有解了吗?
  1. data a;
  2. input id $ realday spending;
  3. datalines;
  4. 10000501 27 27.6
  5. 10000501 187 3.9
  6. 10000501 201 9.1
  7. 10000501 218 3.5
  8. 10000501 249 3.6
  9. 10000501 270 3.5
  10. 10000501 274 8.3
  11. 10000501 292 35.7
  12. 10000501 322 2.3
  13. 10000501 333 7.9
  14. 10000501 343 36
  15. 10000501 434 4.4
  16. 10000501 476 7.9
  17. 10000501 486 5
  18. 10000501 504 10.2
  19. 10000501 508 3.6
  20. ;
  21. run;


  22. %macro ff(id_want,day);
  23. proc sql noprint;
  24. select sum(spending) into :bf_day
  25.   from a
  26.   where id=symget("id_want") and (&day.-26*7+2)<=realday<=(&day.-1)
  27.   ;
  28. select sum(spending) into :af_day
  29.   from a
  30.   where id=symget("id_want") and (&day.+1)<=realday<=(&day.+26*7-2)
  31.   ;
  32. quit;
  33. data res;
  34. set a;
  35. if id=symget("id_want") and realday=symget("day");
  36. bfday=symget("bf_day");
  37. afday=symget("af_day");
  38. run;
  39. %mend ff;

  40. %ff(10000501,292)
复制代码
寒冰凤凰 My blog: http://blog.sina.com.cn/u/1058955485

16
zhangzachary 发表于 2012-2-6 15:30:30
最好把最后realday bfday afday那里的symget变成symgetn,虽然不会影响结果,不过考虑到变量类型和让log规范一点,还是用symputn更好~
寒冰凤凰 My blog: http://blog.sina.com.cn/u/1058955485

17
carol1222 发表于 2012-2-6 15:34:26
zhangzachary 发表于 2012-2-6 15:30
最好把最后realday bfday afday那里的symget变成symgetn,虽然不会影响结果,不过考虑到变量类型和让log规范 ...
真是万分感谢!
我现在如果每个realday的前26周,后26周的值,都要。而且要output到sas 的数据集里面,应该怎么办啊?
花有再开日 人无再少年

18
carol1222 发表于 2012-2-6 15:35:48
zhangzachary 发表于 2012-2-6 15:26
还有个问题,ID是有多个不同的ID的,那么我在最后的output数据集里面需要把他们都列出来,应该怎么办呢?
花有再开日 人无再少年

19
zhangzachary 发表于 2012-2-6 16:30:26
carol1222 发表于 2012-2-6 15:35
还有个问题,ID是有多个不同的ID的,那么我在最后的output数据集里面需要把他们都列出来,应该怎么办呢?
  1. data a;
  2. input id $ realday spending;
  3. datalines;
  4. 10000501 27 27.6
  5. 10000501 187 3.9
  6. 10000501 201 9.1
  7. 10000501 218 3.5
  8. 10000501 249 3.6
  9. 10000501 270 3.5
  10. 10000501 274 8.3
  11. 10000501 292 35.7
  12. 10000501 322 2.3
  13. 10000501 333 7.9
  14. 10000501 343 36
  15. 10000501 434 4.4
  16. 10000501 476 7.9
  17. 10000501 486 5
  18. 10000501 504 10.2
  19. 10000501 508 3.6
  20. ;
  21. run;

  22. data a;
  23. input id $ realday spending;
  24. datalines;
  25. 10000501 27 27.6
  26. 10000501 187 3.9
  27. 10000501 201 9.1
  28. 10000501 218 3.5
  29. 10000501 249 3.6
  30. 10000501 270 3.5
  31. 10000501 274 8.3
  32. 10000501 292 35.7
  33. 10000501 322 2.3
  34. 10000501 333 7.9
  35. 10000501 343 36
  36. 10000501 434 4.4
  37. 10000501 476 7.9
  38. 10000501 486 5
  39. 10000501 504 10.2
  40. 10000501 508 3.6
  41. ;
  42. run;

  43. data _null_;
  44.   set a end=eof;
  45.   if eof then call symput("N",_n_);
  46. run;

  47. data a;
  48.   set a;
  49.   bfday=0;
  50.   afday=0;
  51. run;

  52. %macro ff;

  53. %do i=1 %to &N.;

  54. data _null_;
  55.   set a(firstobs=&i. obs=&i.);
  56.   call symput("id_want",id);
  57.   call symput("day",realday);
  58. run;

  59. proc sql noprint;
  60. select sum(spending) into :bf_day
  61.   from a
  62.   where id=symget("id_want") and (&day.-26*7+2)<=realday<=(&day.-1)
  63.   ;
  64. select sum(spending) into :af_day
  65.   from a
  66.   where id=symget("id_want") and (&day.+1)<=realday<=(&day.+26*7-2)
  67.   ;
  68. quit;

  69. data a;
  70. set a;
  71. if id=symget("id_want") and realday=symgetn("day") then do;
  72. bfday=symgetn("bf_day");
  73. afday=symgetn("af_day");
  74. end;
  75. run;
  76. %end;

  77. %mend ff;

  78. %ff
复制代码
寒冰凤凰 My blog: http://blog.sina.com.cn/u/1058955485

20
zhangzachary 发表于 2012-2-6 16:31:54
不好意思初始数据a多复制了一次……主要参考之后的程序~
寒冰凤凰 My blog: http://blog.sina.com.cn/u/1058955485

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

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