全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
2317 10
2016-10-06
悬赏 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;/ ...
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
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;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2016-10-8 15:33:54
复制代码
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2016-10-8 15:35:55
去重:五秒钟之内的记录?
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2016-10-8 17:43:08
复制代码

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

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

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
你的代码只能去掉第二项,并不能去掉第四项。
可能我之前问题描述得不够清楚,已更新问题描述。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群