楼主: 你不要走
985 2

请教,关于QSCAN [推广有奖]

  • 0关注
  • 0粉丝

本科生

34%

还不是VIP/贵宾

-

威望
0
论坛币
2276 个
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
108 点
帖子
27
精华
0
在线时间
125 小时
注册时间
2015-4-17
最后登录
2019-3-20

你不要走 发表于 2016-6-15 20:03:17 |显示全部楼层
2论坛币
整一个代码如下,其实想问的就是一个问题这里的%let rvars=%trim(%QSCAN(&winsvars,&i,%STR( )));
qscan是什么意思呢?
以及后面的i代表什么,%str代表什么?
解释好像是%qscana,b,c):在a中找到第b个量,且以分隔符c来进行分割

其中%str()其实是指一个表达式“空格”

但是我感觉自己还是不太理解。谢谢大家。

  1. %let winsvars = N_inst_buy_diff vol_inst_buy_diff amount_inst_buy_diff
  2. N_pert_inst_buy_diff vol_pert_inst_buy_diff amount_pert_inst_buy_diff
  3. N_ind_buy_diff vol_ind_buy_diff amount_ind_buy_diff
  4. N_pert_ind_buy_diff vol_pert_ind_buy_diff amount_pert_ind_buy_diff
  5. N_inst_sell_diff vol_inst_sell_diff amount_inst_sell_diff
  6. N_pert_inst_sell_diff vol_pert_inst_sell_diff amount_pert_inst_sell_diff
  7. N_ind_sell_diff vol_ind_sell_diff amount_ind_sell_diff
  8. N_pert_ind_sell_diff vol_pert_ind_sell_diff amount_pert_ind_sell_diff
  9. N_inst_net_event vol_inst_net_event amount_inst_net_event
  10. N_pert_inst_net_event vol_pert_inst_net_event amount_pert_inst_net_event
  11. N_ind_net_event vol_ind_net_event amount_ind_net_event
  12. N_pert_ind_net_event vol_pert_ind_net_event amount_pert_ind_net_event
  13. N_inst_net_benchmark vol_inst_net_benchmark amount_inst_net_benchmark
  14. N_pert_inst_net_benchmark vol_pert_inst_net_benchmark amount_pert_inst_net_benchmark
  15. N_ind_net_benchmark vol_ind_net_benchmark amount_ind_net_benchmark
  16. N_pert_ind_net_benchmark vol_pert_ind_net_benchmark amount_pert_ind_net_benchmark
  17. N_inst_net_diff vol_inst_net_diff amount_inst_net_diff
  18. N_pert_inst_net_diff vol_pert_inst_net_diff amount_pert_inst_net_diff
  19. N_ind_net_diff vol_ind_net_diff amount_ind_net_diff
  20. N_pert_ind_net_diff vol_pert_ind_net_diff amount_pert_ind_net_diff;
  21. %macro winsorize;
  22. %do i=1 %to 60;
  23. %let rvars=%trim(%QSCAN(&winsvars,&i,%STR(  )));
  24. %let pct_u = 99;
  25. %let pct_l = 1;
  26. proc sort data = dtrades_test;
  27. by &rvars;
  28. run;
  29. proc univariate data = dtrades_test noprint;
  30. var &rvars;
  31. output out = temp
  32. p&pct_l = t_p&pct_l
  33. p&pct_u = t_p&pct_u;
  34. run;
  35. data dtrades_test;
  36. set dtrades_test;
  37. temp = 1;
  38. run;
  39. data temp;
  40. set temp;
  41. temp = 1;
  42. run;
  43. data dtrades_test;
  44. merge dtrades_test temp;
  45. by temp;
  46. run;
  47. data dtrades_test;
  48. set dtrades_test;
  49. if &rvars = . then &rvars = .;
  50. else
  51. if &rvars <= t_p&pct_l then &rvars = t_p&pct_l;
  52. if &rvars >= t_p&pct_u then &rvars = t_p&pct_u;
  53. run;
  54. data dtrades_test;
  55. set dtrades_test;
  56. drop t_p&pct_l t_p&pct_u;
  57. run;
  58. %end;
  59. %mend winsorize;
  60. %winsorize;
复制代码


最佳答案

孤单的我们 查看完整内容

楼主对scan函数的描述是正确的,举个例子好理解些 scan(a,b,c) name="Li Lei";我们要取出firstname和lastname,这两者以空格为分隔符。(也就是空格是c) 空格把name分成两部分,第1部分是"Li",第2部分是"Lei"。(1和2就是b) 用scan可以这样取,firstname=scan(name,1," ");lastname=scan(name,2," "); 上面的c字符串是单个的,也可以是多个字符串,多调试下就能理解的更明白了。 另外,因为宏变量是以字符存储的(1 ...
stata SPSS
孤单的我们 发表于 2016-6-15 20:03:18 |显示全部楼层
楼主对scan函数的描述是正确的,举个例子好理解些

scan(a,b,c)
name="Li Lei";我们要取出firstname和lastname,这两者以空格为分隔符。(也就是空格是c)
空格把name分成两部分,第1部分是"Li",第2部分是"Lei"。(1和2就是b)
用scan可以这样取,firstname=scan(name,1," ");lastname=scan(name,2," ");

上面的c字符串是单个的,也可以是多个字符串,多调试下就能理解的更明白了。

另外,因为宏变量是以字符存储的(1个空格就是1个空格,没有前后引号),但和字符型变量的值(" ")有区别,所以用%str( )。

%qscan是宏函数,%qscan和%scan类似;而%scan是scan函数在宏语言里的写法。
回复

使用道具 举报

小符_同学 发表于 2019-1-11 19:29:25 |显示全部楼层
楼上正解!
回复

使用道具 举报

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

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

GMT+8, 2019-3-20 07:56