楼主: caibirdcnb
3129 6

[问答] 请问高手这个算法用SAS怎么实现? [推广有奖]

  • 0关注
  • 36粉丝

讲师

47%

还不是VIP/贵宾

-

威望
0
论坛币
1367 个
通用积分
16.5538
学术水平
67 点
热心指数
70 点
信用等级
64 点
经验
6762 点
帖子
206
精华
2
在线时间
433 小时
注册时间
2011-8-31
最后登录
2023-9-23

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
各位高手,
下面的示例数据,请问用SAS如何实现,有个思路就可以。

谢谢。

希望达成这样的目的(判断标记):
对每个sell列:
如果值是NA,则标记为NA。
如果值不是NA,则判断其值是否大于buy列历史最低值(先排除已经删除的最低值):
        如果是,则标记为1,同时删除buy列的历史最低值;
        否则,标记为0;同时删除buy列该历史最低值。



历史最低值,例如,如果sell列属于Date=5,则buy列的历史最低值只判断Date=1~5,不判断Date=6~8.

先排除已经删除的最低值,例如,如果下表第8行数值是25.2,则标记为0,因为buy列的最低值25.18已经被删除了。

pic.jpg

最近大脑不好使,今天在电脑弄了小半天,逻辑是清晰的,但如何用SAS实现总是有点模糊。
目前想到的是,每次提取2个子集:
A:第N行的子集;(得到当前行的sell值)
B:第1-N行的子集;(得到历史行的最小buy值,并记录最小值所在的行数minrow)
如果sell>min(buy),则A子集增加一列标记为1,否则标记为0。合并所有A子集。
回到原始数据集,将minrow的buy值清空。

但感觉算法很不优雅。应该有什么递归可以简单地实现。

二维码

扫码加我 拉你入群

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

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

关键词:Sell date 原始数据 如何实现 buy 历史 如何

date=5 标记为什么是0 shell=50.96 最低值是25.75

使用道具

藤椅
caibirdcnb 发表于 2016-6-1 16:46:32 |只看作者 |坛友微信交流群
孤单的我们 发表于 2016-6-1 16:31
date=5 标记为什么是0 shell=50.96 最低值是25.75
对,是15.95输成50.95,谢谢指正。

使用道具

  1. data a;
  2. input date sell$ buy$;
  3. cards;
  4. 1 25.75 NA
  5. 2 NA 25.75
  6. 3 NA 25.18
  7. 4 25.66 NA
  8. 5 15.95 NA
  9. 6 NA 25.62
  10. 7 NA 25.7
  11. 8 25.6 NA
  12. ;
  13. run;

  14. data b;
  15.         set a;
  16.         call symputx('nobs',_n_);
  17.         if buy="NA" then buy1=.;
  18.         else buy1=input(buy,best.);
  19. run;


  20. %macro test;
  21. %do i=1 %to &nobs;
  22.         proc sql noprint;
  23.                 select min(buy1) into:min from b where date<=&i;
  24.         quit;
  25.         %put &min;
  26.         data b;
  27.                 set b;
  28.                 if _n_=&i then do;
  29.                         if sell="NA" then do;biaoji="NA";end;
  30.                         else do;
  31.                                 if sell>&min>. then do;biaoji="1";buy1=.;end;
  32.                                 else do;biaoji="0";buy1=.;end;
  33.                         end;
  34.                 end;
  35.         run;
  36. %end;
  37. %mend;
  38. %test;
复制代码
纠正下错误:循环里的sql  where应该写成date<&i;对于第一个观测,没有历史最低值,可以赋个空值

使用道具

报纸
caibirdcnb 发表于 2016-6-2 14:51:17 |只看作者 |坛友微信交流群
多谢楼上的热心。非常简练的code。不过其中删除buy的要求没有达到,可能之前我描述的不清楚,目标是:当sell>min(buy)的时候,清空或删除min(buy)所在的行。

我自己根据你的code写了一个,不过就谈不上简练了。

  1. data a;
  2. input date sell buy;
  3. cards;
  4. 1 25.75 .
  5. 2 .         25.75
  6. 3 .         25.18
  7. 4 25.66 .
  8. 5 15.95 .
  9. 6 .         25.62
  10. 7 .         25.7
  11. 8 25.6 .
  12. ;
  13. run;

  14. data b;
  15.         set a;
  16.         pos=_N_;
  17.         call symput('nobs',_N_);
  18. run;

  19. %macro test;
  20. %do i=1 %to &nobs;
  21.         %let min=0;
  22.         %let pos=0;

  23.     proc sql noprint;
  24.             select min(buy) into:min from b where buy^=. and date<=&i;

  25.     proc sql number noprint;
  26.             select pos into:pos from b where buy^=. and date<=&i having buy=min(buy);
  27.     quit;

  28.     %put &min &pos;

  29.         %if &min=0 or &pos=0 %then %goto next;

  30.     data b;
  31.         set b;
  32.         if _N_=&i and sell^=. and sell>&min then biaoji="1";
  33.                 else if _N_=&i and sell^=. and sell<=&min then biaoji="0";
  34.                 else if (_N_=&i and sell=.) or (_N_>&i) then biaoji="";
  35.                 else biaoji=biaoji;

  36.                 if _N_=&i and biaoji="1" then call symput('delBuy',compress("true"));
  37.                 else call symput('delBuy',compress("false"));
  38.         run;

  39.     data b;
  40.         set b;
  41.         if "delBuy"="true" and _N_=&pos then buy=.;
  42.                 else buy=buy;
  43.         run;

  44. %next:
  45. %end;
  46. %mend;
  47. %test;
复制代码

使用道具

地板
caibirdcnb 发表于 2016-6-2 14:55:16 |只看作者 |坛友微信交流群
if "delBuy"="true" and _N_=&pos then buy=.;

上面这一句需要修改一下:"delBuy"改为"&delBuy"

使用道具

7
孤单的我们 发表于 2016-6-2 15:20:52 |只看作者 |坛友微信交流群

使用道具

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

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

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

GMT+8, 2024-4-20 01:42