楼主: ertyuj
1509 9

[原创博文] 在数据里,如何标识事情发生的相对时间? [推广有奖]

  • 0关注
  • 1粉丝

已卖:7份资源

硕士生

40%

还不是VIP/贵宾

-

威望
0
论坛币
254 个
通用积分
0.7615
学术水平
0 点
热心指数
1 点
信用等级
0 点
经验
-351 点
帖子
136
精华
0
在线时间
164 小时
注册时间
2007-2-7
最后登录
2022-3-17

楼主
ertyuj 发表于 2011-3-3 15:43:52 |AI写论文
5论坛币

最佳答案

关键词:如何

沙发
guoluo 发表于 2011-3-3 15:43:53
  1. data test;
  2.   input Company  Date date11. Event $;
  3.   format date date9.;
  4. cards;
  5. 1 1-Jan-2000 NO
  6. 1 2-Jan-2000 NO
  7. 1 3-Jan-2000 NO
  8. 1 4-Jan-2000 NO
  9. 1 5-Jan-2000 YES
  10. 1 6-Jan-2000 NO
  11. 1 7-Jan-2000 NO
  12. 1 8-Jan-2000 NO
  13. 1 9-Jan-2000 NO
  14. 1 10-Jan-2000 NO
  15. 1 11-Jan-2000 YES
  16. 1 12-Jan-2000 NO
  17. 1 13-Jan-2000 NO
  18. 2 1-Jan-2000 NO
  19. 2 2-Jan-2000 NO
  20. 2 3-Jan-2000 NO
  21. 2 4-Jan-2000 NO
  22. 2 5-Jan-2000 YES
  23. 2 6-Jan-2000 NO
  24. 2 7-Jan-2000 NO
  25. 2 8-Jan-2000 NO
  26. 2 9-Jan-2000 NO
  27. 2 10-Jan-2000 NO
  28. 2 11-Jan-2000 YES
  29. 2 12-Jan-2000 NO
  30. 2 13-Jan-2000  NO
  31. ;

  32. data event;
  33.   set test;
  34.   if event = "YES" then do;
  35.     count = 0;
  36.     output;
  37.         event = "NO";
  38.         date=date-1;
  39.         count=-1;
  40.         output;
  41.         event = "NO";
  42.         date=date-1;
  43.         count=-2;
  44.         output;
  45.         event = "NO";
  46.         date=date+3;
  47.         count=1;
  48.         output;
  49.         event = "NO";
  50.         date=date+1;
  51.         count=2;
  52.         output;
  53.   end;
  54. run;
  55.   
  56. proc sort data=test;
  57. by company date event;
  58. proc sort data=event;
  59. by company date event;

  60. data test;
  61.   merge test(in=a) event(in=b);
  62.   by company date event;
  63.   if a and not b then count=99;
  64.   if a;
  65. run;
复制代码

藤椅
ertyuj 发表于 2011-3-3 16:00:42
不知为何,求助内容没有成功上传。求助内容如下:
假设我的数据如下:
Company        Date                         Event
1        1-Jan-2000                         NO
1        2-Jan-2000                         NO
1        3-Jan-2000                         NO
1        4-Jan-2000                         NO
1        5-Jan-2000                        YES
1        6-Jan-2000                         NO
1        7-Jan-2000                         NO
1        8-Jan-2000                         NO
1        9-Jan-2000                         NO
1        10-Jan-2000                NO
1        11-Jan-2000               YES
1        12-Jan-2000               NO
1        13-Jan-2000               NO
。。。
2        1-Jan-2000                        NO
2        2-Jan-2000                        NO
2        3-Jan-2000                        NO
2        4-Jan-2000                        NO
2        5-Jan-2000                        YES
2        6-Jan-2000                       NO
2        7-Jan-2000                       NO
2        8-Jan-2000                       NO
2        9-Jan-2000                       NO
2        10-Jan-2000              NO
2        11-Jan-2000             YES
2        12-Jan-2000             NO
2        13-Jan-2000             NO
我需要创建一个新的变量“COUNT”,这个变量取值如下:
如果Event = YES,那么COUNT=0.
如果日期等于YES之前一天,COUNT=-1.
如果日期等于YES之后一天,COUNT=1.
如果日期等于YES之前两天,COUNT=-2.
如果日期等于YES之后两天,COUNT=2.
对于其他情况,COUNT=99.
最终数据应为如下:
Company        Date        Event        Count
1        1-Jan-2000                              NO        99
1        2-Jan-2000                              NO        99
1        3-Jan-2000                              NO        -2
1        4-Jan-2000                              NO        -1
1        5-Jan-2000                              YES        0
1        6-Jan-2000                              NO        1
1        7-Jan-2000                              NO        2
1        8-Jan-2000                              NO        99
1        9-Jan-2000                              NO        -2
1        10-Jan-2000        NO        -1
1        11-Jan-2000        YES        0
1        12-Jan-2000        NO        1
1        13-Jan-2000        NO        2
                       
2        1-Jan-2000                              NO        99
2        2-Jan-2000                              NO        99
2        3-Jan-2000                              NO        -2
2        4-Jan-2000                              NO        -1
2        5-Jan-2000                              YES        0
2        6-Jan-2000                              NO        1
2        7-Jan-2000                              NO        2
2        8-Jan-2000                              NO        99
2        9-Jan-2000                              NO        -2
2        10-Jan-2000        NO        -1
2        11-Jan-2000        YES        0
2        12-Jan-2000        NO        1
2        13-Jan-2000        NO        2
请问,如何编码用以按照要求创建这个新的变量COUNT?非常感谢.

板凳
baoaibaobao 发表于 2011-3-3 17:24:05
提供一种思路,比较繁琐。
  1. data zachary;
  2. input  Company Date:date11. Event$;
  3. format date date11.;
  4. cards;
  5. 1        1-Jan-2000 NO
  6. 1        2-Jan-2000 NO
  7. 1        3-Jan-2000 NO
  8. 1        4-Jan-2000  NO
  9. 1        5-Jan-2000  YES
  10. 1        6-Jan-2000  NO
  11. 1        7-Jan-2000  NO
  12. 1        8-Jan-2000  NO
  13. 1        9-Jan-2000   NO
  14. 1        10-Jan-2000  NO
  15. 1        11-Jan-2000  YES
  16. 1        12-Jan-2000  NO
  17. 1        13-Jan-2000  NO
  18. 2        1-Jan-2000   NO
  19. 2        2-Jan-2000   NO
  20. 2        3-Jan-2000   NO
  21. 2        4-Jan-2000   NO
  22. 2        5-Jan-2000   YES
  23. 2        6-Jan-2000   NO
  24. 2        7-Jan-2000   NO
  25. 2        8-Jan-2000   NO
  26. 2        9-Jan-2000   NO
  27. 2        10-Jan-2000  NO
  28. 2        11-Jan-2000  YES
  29. 2        12-Jan-2000  NO
  30. 2        13-Jan-2000  NO
  31. ;
  32. proc sort data=zachary;
  33. by company descending date ;
  34. data zachary;set zachary;
  35. by company;
  36. retain date2;
  37. if event='YES' then do;
  38.         count=0;
  39.         date2=date;
  40. end;
  41. else do;
  42.         if date=date2-1 then count=-1;
  43.         if date=date2-2 then count=-2;
  44. end;
  45. run;       
  46. proc sort data=zachary;
  47. by company date ;
  48. data zachary(drop=date1 date2);
  49. set zachary;
  50. by company;
  51. retain date1;
  52. if event='YES' then do;
  53.         count=0;
  54.         date1=date;
  55. end;
  56. else do;
  57.         if date=date1+1 then count=1;
  58.         if date=date1+2 then count=2;
  59.         if count=. then count=99;
  60. end;
  61. run;
复制代码

报纸
soporaeternus 发表于 2011-3-3 17:50:29
如果两个event date很近,比如只差2天,当一个日期的count可能根据前后event有不同值时,以哪一个为准?
Let them be hard, but never unjust

地板
guoluo 发表于 2011-3-3 17:51:13
同一个公司两个时间之间间隔少于四天的话,count如何赋值,楼主没有给出规则

7
ertyuj 发表于 2011-3-4 12:39:03
实在惭愧,感觉自己最近办事非常罗嗦,拖沓,精神不在状态,希望大家不要介意。
我把没有澄清的地方重新说一下。
其实,我要研究的问题是这个样子的:
当有宏观市场大事时,例如银行加息,金融危机等等,如何影响各个公司的发展。所以如有大事发生,这个就意味着,对于所有的公司来说,都有大事发生。
不知3楼,4都(baoaibaobao ,guoluo)的方法是否依然适用?如果是的话,我将一定啃透。
非常感谢。

8
275769263 发表于 2011-3-4 17:24:08
这个还可以实现,但是若是两天连着是YES的话你提供的规则不够明确。
data sample1;
input  Company Date:date11. Event$;
format date date11.;
if Event='NO' then change=0;
if Event='YES' then change=1;
cards;
1        1-Jan-2000 NO
1        2-Jan-2000 NO
1        3-Jan-2000 NO
1        4-Jan-2000  NO
1        5-Jan-2000  YES
1        6-Jan-2000  NO
1        7-Jan-2000  NO
1        8-Jan-2000  NO
1        9-Jan-2000   NO
1        10-Jan-2000  NO
1        11-Jan-2000  YES
1        12-Jan-2000  NO
1        13-Jan-2000  NO
2        1-Jan-2000   NO
2        2-Jan-2000   NO
2        3-Jan-2000   NO
2        4-Jan-2000   NO
2        5-Jan-2000   YES
2        6-Jan-2000   NO
2        7-Jan-2000   NO
2        8-Jan-2000   NO
2        9-Jan-2000   NO
2        10-Jan-2000  NO
2        11-Jan-2000  YES
2        12-Jan-2000  NO
2        13-Jan-2000  NO
;

proc expand data=sample1 out=sample2 method=none;
by company;
        convert change=before2/transform=(lead 2);
        convert change=before1/transform=(lead 1);
        convert change=after1/transform=(lag 1);
        convert change=after2/transform=(lag 2);
run;
data sample3;
set sample2;
count=99;
if before2=1 then count=-2;
if before1=1 then count=-1;
if after1=1 then count=1;
if after2=1 then count=2;
if change=1 then count=0;
keep Company Date Event count ;
run;

9
ccgzl 发表于 2011-3-5 09:41:31
我看了看,做事件研究有时候日期会重复出现,即某天即可能是一个事件的+1,也有可能是另一事件的-3,对于这种情况就把该日期在两个事件都出现,而不是单纯属于一个事件,我用SQL做的,可以实现我的要求,你自己看看。

data chen;
input  Company Date:date11. Event$;
cards;
1        1-Jan-2000 NO
1        2-Jan-2000 NO
1        3-Jan-2000 NO
1        4-Jan-2000  NO
1        5-Jan-2000  YES
1        6-Jan-2000  NO
1        7-Jan-2000  NO
1        8-Jan-2000  NO
1        9-Jan-2000   NO
1        10-Jan-2000  NO
1        11-Jan-2000  YES
1        12-Jan-2000  NO
1        13-Jan-2000  NO
2        1-Jan-2000   NO
2        2-Jan-2000   NO
2        3-Jan-2000   NO
2        4-Jan-2000   NO
2        5-Jan-2000   YES
2        6-Jan-2000   NO
2        7-Jan-2000   NO
2        8-Jan-2000   NO
2        9-Jan-2000   NO
2        10-Jan-2000  NO
2        11-Jan-2000  YES
2        12-Jan-2000  NO
2        13-Jan-2000  NO
;
run;

proc sql;
create table eventdate as select company,date as eventdate from chen where event='YES';
quit;

proc sql;
create table chen1 as select * from chen left join eventdate on chen.company=eventdate.company;
quit;

proc sort data=chen1;
by company eventdate date ;
run;

data chen2;
set chen1;
count=date-eventdate;
if -5<=count<=2 then output chen2;
run;

10
ertyuj 发表于 2011-3-8 10:09:43
由于大家的鼎力相助,已经得到解决!非常感谢。

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

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