楼主: playmore
1524 1

[程序分享] SAS基础宏之15:GetCountForSeq [推广有奖]

已卖:1645份资源

学科带头人

2%

还不是VIP/贵宾

-

TA的文库  其他...

R相关

经济学相关

金融工程

威望
1
论坛币
16356 个
通用积分
8.6697
学术水平
372 点
热心指数
394 点
信用等级
341 点
经验
15297 点
帖子
1194
精华
1
在线时间
1332 小时
注册时间
2007-1-11
最后登录
2025-12-1

初级学术勋章 初级热心勋章 中级热心勋章

楼主
playmore 发表于 2013-5-10 09:27:06 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
就是用来数一个序列的重复次数的
在Matlab和R中,这个问题挺简单的
在SAS里就稍微复杂点,因为SAS只能在Data步里从上至下依次的循环

  1. %macro GetCountForSeq(SourceTable,TargetTable,ByFactors,InputVar,OutputVar);

  2. /**********************************************************************/
  3. /* 此宏的作用是计算某数据表中指定变量的重复次数,即连续出现同一值的次 */
  4. /* 数。其中,SourceTable是原始表格;TargetTable是结果表格;ByFactors  */
  5. /* 是分组变量;InputVar是目标变量,可设置为多个,用空格分隔;Output_  */
  6. /* Var是结果变量,其值为该观测值在序列中重复的次数,若不指定,则为原  */
  7. /* 目标变量后加后缀_Cnt。注意,在运行本宏之前需要将原始表格进行合适的 */
  8. /* 排序。                                                             */
  9. /*                                                                    */
  10. /* 最终得到包含原数据表中指定变量的重复次数的结果表格。               */
  11. /*                                                                    */
  12. /*                                      Created on 2012.12.21         */
  13. /*                                      Modified on 2013.3.20         */
  14. /**********************************************************************/

  15. /* 检查TargetTable的存在性,若不存在则设为&SourceTable */
  16. %if &TargetTable EQ %STR() %then %let TargetTable=&SourceTable;

  17. /* 检查ByFactors的存在性 */
  18. %if &ByFactors NE %STR() %then %do;
  19.         %ChkVar(SourceTable=&SourceTable,InputVar=&ByFactors,FlagVarExists=GCFS_FlagVarExists1);

  20.         %if %SYSFUNC(FIND(&GCFS_FlagVarExists1,0)) NE 0 %then %do;
  21.                 %put ERROR: The ByFactors "%SCAN(&ByFactors,%SYSFUNC(FIND(&GCFS_FlagVarExists1,0)))" does not exist in SourceTable, please check it again.;
  22.                 %goto exit;
  23.         %end;
  24. %end;

  25. /* 检查InputVar的存在性 */
  26. %ChkVar(SourceTable=&SourceTable,InputVar=&InputVar,FlagVarExists=GCFS_FlagVarExists2);

  27. %if %SYSFUNC(FIND(&GCFS_FlagVarExists2,0)) NE 0 %then %do;
  28.         %put ERROR: The InputVar "%SCAN(&InputVar,%SYSFUNC(FIND(&GCFS_FlagVarExists2,0)))" does not exist in SourceTable, please check it again.;
  29.         %goto exit;
  30. %end;

  31. /* 拆分InputVar */
  32. %SeparateString(InputString=&InputVar,OutputString=GCFS_InputVar);

  33. /* 检查OutputVar的合法性 */
  34. %if &OutputVar NE %STR() AND %SYSFUNC(COUNT(&InputVar,%STR( ))) NE %SYSFUNC(COUNT(&OutputVar,%STR( ))) %then %do;
  35.         %put ERROR: The number of InputVar and OutputVar should be equal, please check it again.;
  36.         %goto exit;
  37. %end;

  38. /* 若OutputVar为空,则设置为InputVar后加_Cnt后缀 */
  39. %if &OutputVar EQ %STR() %then %do;
  40.         %let OutputVar=%SYSFUNC(TRANWRD(&InputVar,%STR( ),_Cnt%STR( )))_Cnt;
  41. %end;

  42. /* 拆分OutputVar */
  43. %SeparateString(InputString=&OutputVar,OutputString=GCFS_OutputVar);

  44. /* 开始进行计算 */
  45. /* 第一步:生成新的分组变量 */
  46. data &TargetTable;
  47.         set &SourceTable;
  48.         GCFS_OrderVar=_N_;
  49. run;

  50. %do GCFS_i=1 %to &GCFS_InputVar_Num;
  51.         data &TargetTable;
  52.                 set &TargetTable;
  53.                 retain GCFS_VarNo_&GCFS_i GCFS_ByFactors_&GCFS_i;
  54.                 by &ByFactors &&GCFS_InputVar_Var&GCFS_i NOTSORTED;
  55.                 if first.&&GCFS_InputVar_Var&GCFS_i then GCFS_VarNo_&GCFS_i.=1;
  56.                 else GCFS_VarNo_&GCFS_i.+1;
  57.                 if _N_=1 and first.&&GCFS_InputVar_Var&GCFS_i.=1 then GCFS_ByFactors_&GCFS_i.=1;
  58.                 else if first.&&GCFS_InputVar_Var&GCFS_i then GCFS_ByFactors_&GCFS_i.+1;
  59.         run;
  60. %end;

  61. /* 第二步:得到计数变量 */
  62. %do GCFS_j=1 %to &GCFS_InputVar_Num;
  63.         proc sort data=&TargetTable;
  64.                 by GCFS_ByFactors_&GCFS_j DESCENDING GCFS_VarNo_&GCFS_j.;
  65.         run;

  66.         data &TargetTable(drop=GCFS_ByFactors_&GCFS_j GCFS_VarNo_&GCFS_j.);
  67.                 set &TargetTable;
  68.                 by GCFS_ByFactors_&GCFS_j;
  69.                 retain &&GCFS_OutputVar_Var&GCFS_j;
  70.                 if first.GCFS_ByFactors_&GCFS_j then &&GCFS_OutputVar_Var&GCFS_j=GCFS_VarNo_&GCFS_j;
  71.         run;
  72. %end;

  73. /* 删除临时生成的OrderVar */
  74. proc sort data=&TargetTable out=&TargetTable(drop=GCFS_OrderVar);
  75.         by GCFS_OrderVar;
  76. run;

  77. %exit:
  78. %mend;


  79. %macro Demo();

  80. %let SourceTable=RankOfStk;
  81. %let TargetTable=RankOfStk1;
  82. %let ByFactors=;
  83. %let InputVar=PE_Rank;                /* 需要处理的目标变量,可设置为多个,用空格分隔 */
  84. %let OutputVar=;
  85. %GetCountForSeq(&SourceTable,&TargetTable,&ByFactors,&InputVar,&OutputVar);

  86. %mend;
复制代码



二维码

扫码加我 拉你入群

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

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

关键词:sas基础 Count etc For Get 数据表

已有 2 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
webgu + 60 + 60 + 3 + 3 + 3 精彩帖子
boe + 1 + 1 + 1 精彩帖子

总评分: 经验 + 60  论坛币 + 60  学术水平 + 4  热心指数 + 4  信用等级 + 4   查看全部评分

本帖被以下文库推荐

playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

沙发
ryuuzt 发表于 2013-5-12 08:49:30
学习了。等暑假从头到尾好好学一遍。

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-27 01:34