楼主: 小鳄鱼a
1073 29

请教个程序 [推广有奖]

  • 6关注
  • 10粉丝

学科带头人

3%

还不是VIP/贵宾

-

威望
0
论坛币
125 个
通用积分
0.0040
学术水平
40 点
热心指数
45 点
信用等级
43 点
经验
32801 点
帖子
1185
精华
0
在线时间
1539 小时
注册时间
2009-7-16
最后登录
2018-10-5

1000论坛币
如附件

b.zip

8.25 KB

本附件包括:

  • b.xls

最佳答案

木叶知秋 查看完整内容

你看下是不是你想要的结果
关键词:程序
沙发
木叶知秋 发表于 2015-9-10 21:36:10 |只看作者 |坛友微信交流群
你看下是不是你想要的结果
  1. data rawdata;
  2. input id$ stk$ year qtr;
  3. qtr2=yyq(year, qtr);
  4. format qtr2 yyq6.;
  5. cards;
  6. 1        2        1996        3
  7. 1        2        1996        4
  8. 1        2        1997        1
  9. 1        3        1995        1
  10. 1        3        1995        2
  11. 1        3        1998        2
  12. 1        3        1998        3
  13. 1        3        1999        3
  14. 2        3        1995        1
  15. 2        3        1995        2
  16. 2        3        1995        3
  17. 2        3        1998        1
  18. 3        3        1995        2
  19. 3        3        1995        3
  20. 3        3        1998        2
  21. 3        3        2000        1
  22. 3        4        1996        1
  23. 3        4        1996        2
  24. 3        2        1997        1
  25. ;
  26. run;

  27. **数据整理;
  28. proc sort data=rawdata(drop=year qtr) out=test;
  29. by stk qtr2 id;
  30. run;
  31. data test2;
  32.         set test;
  33.         by stk qtr2 id;
  34.         length ids $20.;
  35.         retain ids cnt;
  36.         if first.qtr2 then do
  37.                 ids="";
  38.                 cnt=0;
  39.         end;
  40.         ids=catx(',',ids,id);
  41.         cnt+1;
  42.         if last.qtr2 then output;
  43.         drop id;
  44. run;

  45. **定义首次出现;
  46. data test3;
  47. set test2;
  48. qtr_lag=lag(qtr2);
  49. length remark $20.;
  50. by stk;
  51. if first.stk then remark="首次出现";
  52. else if qtr_lag^=intnx('qtr',qtr2,-1) then remark="首次出现";
  53. else remark="非首次出现";
  54. drop qtr_lag;
  55. run;

  56. **数据整理;
  57. data test4;
  58. merge test3 test3(firstobs=2 keep=ids cnt rename=(ids=nextids cnt=nextcnt));
  59. run;
  60. data test4;
  61. set test4;
  62. by stk;
  63. if last.stk then do nextids=.; nextcnt=0; end;
  64. run;

  65. **计算x\y\z;
  66. data test5;
  67.         set test4;
  68.         if remark="首次出现" then
  69.                 do;
  70.                         x=cnt;
  71.                         i=1;y=0;
  72.                         do while(scan(nextids,i,',') ne "");
  73.                                 if index(ids,scan(nextids,i,','))=0 then y=y+1;
  74.                                 i+1;
  75.                         end;
  76.                 end;
  77. drop i cnt nextcnt nextids;
  78. if x+y>1 then z=(x-1)/(x+y-1);
  79. run;
复制代码
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
小鳄鱼a + 5 + 5 + 5 + 5 精彩帖子

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

使用道具

藤椅
残阳_等待 发表于 2015-9-10 23:24:13 |只看作者 |坛友微信交流群
哇塞,高价悬赏啊

使用道具

板凳
小鳄鱼a 发表于 2015-9-12 16:31:43 |只看作者 |坛友微信交流群
没有会的朋友吗

使用道具

报纸
小鳄鱼a 发表于 2015-9-13 08:51:16 |只看作者 |坛友微信交流群
如果描述不清楚可以提出

使用道具

地板
teqel 发表于 2015-9-13 11:24:44 |只看作者 |坛友微信交流群
归结为几个问题:
1. 怎么算时间间隔。也许可以先把年月日拼起来,然后用intck()函数。或者索性给时间编一个号。例如:

1: 1996 Q1
2:1996 Q2
3: 1996 Q3
。。。

使用道具

7
小鳄鱼a 发表于 2015-9-13 13:57:49 |只看作者 |坛友微信交流群
部分结果如下  

stk        year        qtr        z
3        1995        1        0.5
3        1998        1        0

使用道具

8
小鳄鱼a 发表于 2015-9-13 13:58:28 |只看作者 |坛友微信交流群
teqel 发表于 2015-9-13 11:24
归结为几个问题:
1. 怎么算时间间隔。也许可以先把年月日拼起来,然后用intck()函数。或者索性给时间编一 ...
我最开始用的lag     后来发现还是多麻烦的

使用道具

9
teqel 发表于 2015-9-13 23:00:54 |只看作者 |坛友微信交流群
先建立一个时间列表, 然后把这个标志t放在你的数据后面;
  1. data test;
复制代码

使用道具

10
teqel 发表于 2015-9-14 06:32:57 |只看作者 |坛友微信交流群
什么鬼论坛,怎么老是“小伙伴出错了?”

使用道具

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

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

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

GMT+8, 2024-4-24 02:23