楼主: Kaeder
1958 10

数据集内如何去掉五秒钟之内的项? [推广有奖]

  • 0关注
  • 0粉丝

VIP1+

高中生

45%

还不是VIP/贵宾

-

威望
0
论坛币
8735 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
1841 点
帖子
14
精华
0
在线时间
28 小时
注册时间
2016-5-19
最后登录
2020-1-19

50论坛币
可能我之前的问题描述不太清楚,更新了一下描述。

------------------------------------------------------------------------------------------------------------

之前发表过这个帖子,不过没有回应。这次加了悬赏,希望各位大大能够拨冗指点一二。

------------------------------------------------------------------------------------------------------------

我的数据有这些列:
SYMBOL TIME PRICE

现在想把相同SYMBOL和PRICE,又在五秒钟之内的项合并,也就是说假设有这些项:
AA 9:00:00 10
AA 9:00:03 10
AA 9:00:06 10
AA 9:00:07 12   
AA 9:00:08 10
BB 9:00:00 30

合并之后第二行和第五行会被去掉,也就是:
AA 9:00:00 10
AA 9:00:06 10
AA 9:00:07 12
BB 9:00:00 30


相当于是个动态循环:对第一项,去掉五秒内的重复项;去掉之后,对更新后的数据集内第二项,去掉五秒内的重复项;再对更新后的数据集内的第三项。。。如此循环,直到最后一项。

我试着用以下代码(数据集名称为trade):
data tempct;
  set trade;
run;

data trade;
  set tempct;
  time1=intnx("SECOND", time, -5, "SAME");
  lagsymbol=lag(symbol);
  lagprice=lag(price);
  lagtime=lag(time);            
  if symbol = lagsymbol & lagtime >= time1 & price = lagprice  then
    do; no=_n_; modify trade point=no; remove; end;
run;


但是得到的结果却是:
AA 9:00:00 10
AA 9:00:07 12
AA 9:00:08 10
BB 9:00:00 30

第三项被去掉了,第五行没去掉。。。应该是因为lagtime并不能得到五秒内的项被去掉之后新的前一项的time。我试了试其他方法,得到的结果更差。。。请问各位大大,有没有办法实现我对数据集的操作目标呢?

最佳答案

l1i2n3i4n5g 查看完整内容

data trade; input symbol $ time : time12. price; format time time12.; cards; AA 9:00:00 10 AA 9:00:03 10 AA 9:00:06 10 AA 9:00:07 12 AA 9:00:08 10 BB 9:00:00 30 ; run; proc sort data=trade; by symbol price time; run; data trade; set trade; lag_symbol=lag(symbol); lag_price=lag(price); retain tmp; format tmp time8.; if symbol^=lag_symbol or price^=lag_price then tmp=time;/ ...
关键词:数据集 symbol REMOVE Second modify price trade 如何
沙发
l1i2n3i4n5g 在职认证  发表于 2016-10-6 16:51:11 |只看作者 |坛友微信交流群
data trade;
input symbol $ time : time12. price;
format time time12.;
cards;
AA 9:00:00 10
AA 9:00:03 10
AA 9:00:06 10
AA 9:00:07 12
AA 9:00:08 10
BB 9:00:00 30
;
run;

proc sort data=trade;
        by symbol price time;
run;

data trade;
set trade;
lag_symbol=lag(symbol);
lag_price=lag(price);
retain tmp;
format tmp time8.;
if symbol^=lag_symbol or price^=lag_price then tmp=time;/*“相同SYMBOL和PRICE”不满足时,则不合并*/
else do;
        if time-tmp<=5 then delete;/*把相同SYMBOL和PRICE,又在五秒钟之内的项合并*/
        else tmp=time;/*把相同SYMBOL和PRICE,但不在五秒钟之内的项保留*/
end;
keep symbol time price;
run;
已有 1 人评分学术水平 热心指数 收起 理由
Kaeder + 3 + 3 我很赞同

总评分: 学术水平 + 3  热心指数 + 3   查看全部评分

使用道具

藤椅
蓝_23 发表于 2016-10-8 15:33:54 |只看作者 |坛友微信交流群
  1. ***read in;
  2. data trade;
  3. format time time8.;
  4. informat time time8.;
  5. input SYMBOL $ TIME PRICE;
  6. cards;
  7. AA 9:00:00 10
  8. AA 9:00:03 10
  9. AA 9:00:06 10
  10. AA 9:00:07 12
  11. BB 9:00:00 30
  12. ;
  13. run;

  14. ***step one: split into two parts;
  15. data part1 part2;
  16.     set trade;
  17.     second=input(scan(put(time,time8.),3,":"),best.);
  18.     if second <= 5 then output part1;
  19.     else output part2;
  20. run;

  21. ***step two: delete duplicate obeservations;
  22. proc sort data=part1  out=nodup dupout=dup  nodupkey;
  23.     by SYMBOL  PRICE;
  24. run;

  25. ***step three: merge ;
  26. data final;
  27.     set nodup part2;
  28.     by SYMBOL  PRICE;
  29. run;

  30. proc print;
  31. run;
复制代码
已有 1 人评分学术水平 热心指数 收起 理由
Kaeder + 1 + 1 热心帮助其他会员

总评分: 学术水平 + 1  热心指数 + 1   查看全部评分

使用道具

板凳
蓝_23 发表于 2016-10-8 15:35:55 |只看作者 |坛友微信交流群
去重:五秒钟之内的记录?

使用道具

报纸
prince315 在职认证  发表于 2016-10-8 17:43:08 |只看作者 |坛友微信交流群
  1. %macro dedup(in,out,key);
  2. proc sort data=&in. out=tmp_st; by &key. inq_date; run;

  3. data tmp2;
  4. set tmp_st;
  5. by &key. inq_date swift_number descending match_ind descending match_internal_ind;

  6. if first.inq_date or &key. = "";
  7. run;

  8. data &out.;
  9. set tmp2;
  10. by &key. inq_date;
  11. retain comp_date;
  12. if first.&key. then do; key_cnt=1; comp_date = inq_date; end;
  13. else do;
  14.         key_cnt+1;
  15.         if inq_date - comp_date >=3 then comp_date = inq_date;
  16. end;

  17. if &key. ne "" and 0 < inq_date - comp_date < 3 then del_ind=1;

  18. run;
  19. %mend;
复制代码

这是我此前做去重所有3天以内的记录的代码,最后将del_ind=1的删掉就可以了。你这个目的应该很类似,稍稍改一下就能用。

已有 1 人评分热心指数 收起 理由
Kaeder + 1 热心帮助其他会员

总评分: 热心指数 + 1   查看全部评分

使用道具

地板
Kaeder 发表于 2016-10-9 19:40:29 |只看作者 |坛友微信交流群
蓝_23 发表于 2016-10-8 15:33
感谢你的回答,但是你的代码并不能解决我的问题。并不只是去除第一项五秒内的重复项,而是相当于进行一个动态循环:对第一项,去掉五秒内的重复项;去掉之后,对更新后的数据集内第二项,去掉五秒内的重复项,直到最后一项。举例来说,对于如下数据集:
AA 9:00:00 10
AA 9:00:03 10
AA 9:00:06 10
AA 9:00:07 10
AA 9:00:07 12
BB 9:00:00 30
你的代码只能去掉第二项,并不能去掉第四项。
可能我之前问题描述得不够清楚,已更新问题描述。

使用道具

7
Kaeder 发表于 2016-10-9 19:41:21 |只看作者 |坛友微信交流群
prince315 发表于 2016-10-8 17:43
这是我此前做去重所有3天以内的记录的代码,最后将del_ind=1的删掉就可以了。你这个目的应该很类似,稍稍 ...
谢谢,我试试看

使用道具

8
Kaeder 发表于 2016-10-10 10:04:29 |只看作者 |坛友微信交流群
l1i2n3i4n5g 发表于 2016-10-10 00:38
data trade;
input symbol $ time : time12. price;
format time time12.;
非常感谢!试了一下没有问题。这个代码构建的角度也是我之前没有想到过的。

使用道具

9
prince315 在职认证  发表于 2016-10-10 17:09:05 |只看作者 |坛友微信交流群
Kaeder 发表于 2016-10-10 10:04
非常感谢!试了一下没有问题。这个代码构建的角度也是我之前没有想到过的。
我当时也是苦于各种lag返回值不能如预期所料,试了好多种方法

使用道具

10
tobe同学 发表于 2016-10-11 16:50:12 |只看作者 |坛友微信交流群
l1i2n3i4n5g 发表于 2016-10-6 16:51
data trade;
input symbol $ time : time12. price;
format time time12.;
大神,能给具体解释一下程序具体是怎么样运行的吗?为什么用普通的if就不行,用else do就可以呢?

使用道具

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

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

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

GMT+8, 2024-4-26 01:17