楼主: harlon1976
6006 34

[原创博文] 请教这个程序应该如何编写 [推广有奖]

11
crackman 发表于 2010-3-12 12:21:06
JINGJU学习到了
谢谢

12
frackdeng 发表于 2010-3-12 12:47:10
  1. data class;
  2.    input class $ @@;
  3.    datalines;
  4.    A A A B B C
  5.    ;
  6. run;

  7. %macro  class;
  8. proc sql;   
  9.    select count(distinct class) into :class_n from class;
  10.    select count(*) into :number from class ;
  11. quit;

  12. %let class_n=&class_n;
  13. %let number=&number;

  14. proc sql;
  15.    select distinct class into :class1-:class&class_n  from class;
  16.    %do i=1 %to &class_n;
  17.    select count(*) into :&&class&i from class where class="&&class&i";
  18.    %end;
  19. quit;

  20. proc sql;
  21.     create table test1 as
  22.         select distinct
  23.         %do i=1 %to &number-1;
  24.             a&i..class as a&i,
  25.         %end;
  26.         a&number..class as a&number
  27.         from
  28.         %do i=1 %to &number-1;
  29.             class as a&i,
  30.         %end;
  31.            class as a&number;
  32. quit;

  33. data test2;
  34.       set test1;

  35.           %do i=1 %to &class_n;
  36.       n_&&class&i=0;
  37.           %end;

  38.       %do i=1 %to &number;
  39.             %do j=1 %to &class_n;
  40.         if a&i="&&class&j" then n_&&class&j=n_&&class&j+1;
  41.                 %end;
  42.       %end;

  43.       %do i=1 %to &class_n;
  44.             if n_&&class&i=&&&&&&class&i;
  45.         %end;
  46. run;
  47. %mend class;

  48. %class;
复制代码
已有 1 人评分学术水平 收起 理由
jingju11 + 1 wow

总评分: 学术水平 + 1   查看全部评分

13
jingju11 发表于 2010-3-12 13:20:33
harlon1976 发表于 2010-3-12 09:05
感谢楼上兄弟的无私奉献,我要仔细学习,我再问一下,如果还是2类,但观测个数不是五个,例如共有n个,其中A有x个,B有y个,则总共的结果有N=n!/(x!*y!),那么这个程序中的一些参数应该如何调整,最好能将这些参数放在宏中,能够任意附值。请兄弟再赐教啊。

  1. DATA RAW;
  2. INPUT X  class  $;
  3. DATALINES;
  4. 1      A
  5. 5      B
  6. 4      A
  7. 2      B
  8. 8      A
  9. 9     A
  10. ;
  11. PROC SQL NOPRINT;
  12. SELECT DISTINCT CLASS, COUNT(*) INTO :C1-:C2, :N1-:N2 FROM RAW GROUP BY CLASS;
  13. QUIT;
  14. %LET N = %EVAL(&N1+&N2);
  15. %LET Ncombinations = %SYSFUNC(COMB(&N, &N1));
  16. DATA RAW1;
  17. SET RAW;
  18. IF _N_ = 1 THEN DO;
  19.   NA = 0; NB = 0;
  20. END;
  21.   NA +(class = "&C1"); NB +(class = "&C2");
  22.   N = NA*(class = "&C1")+NB*(class = "&C2");
  23. RUN;
  24. PROC PLAN;
  25.       factors combination = &Ncombinations ordered ZZ = &N1 of &N comb;
  26.       ods output Plan = Combinations;
  27. RUN;
  28. DATA  Combinations_1;
  29. SET Combinations;
  30. ARRAY XX{&N} $; ARRAY  ZZ{&N1};
  31. DO I = 1 TO DIM(XX);
  32.   DO J = 1 TO DIM(ZZ);
  33.    IF ZZ[J] = I THEN DO;
  34.     XX[I] = "&C1";
  35.     LEAVE;
  36.    END;   
  37.   END;
  38.   IF  XX[I] NE "&C1" THEN XX[I] = "&C2";;
  39.   class = XX[I];
  40.   NA = SUM(NA, (class = "&C1")); NB = SUM(NB, (class = "&C2"));
  41.   N = NA*(class = "&C1")+NB*(class = "&C2");
  42.       OUTPUT;
  43. END;
  44. KEEP combination class N;
  45. RUN;
  46. PROC SQL;
  47. CREATE TABLE Total AS
  48.   SELECT a.combination, a.class, b.X FROM Combinations_1 AS a, RAW1 AS b
  49.    WHERE a.class = b.class AND a.N = b.N;
  50. QUIT;
  51. %MACRO OUTPUTmcr;
  52. %DO I = 1 %TO &Ncombinations;
  53.   DATA Dset&I;
  54.    SET Total (WHERE = (combination = &I));
  55.   RUN;
  56. %END;
  57. %MEND OUTPUTmcr;
  58. %OUTPUTmcr
  59. ;
  60. /*Assuming there is no missing class variable (2 levels) and no replicated records, that is X by Class unique*/
复制代码

14
jingju11 发表于 2010-3-12 13:25:09
12# frackdeng

Hi, I spent too much coding on connecting variable x and class. Why you just ignore X?

sorry. this is a very good code. Thanks, I learn a lot.

15
frackdeng 发表于 2010-3-12 13:46:03
我没理解错的话,应该就是把class排序而已,之后只要把X对应上去就可以了。在这里A对应1,4,8;B对应,5,2
14# jingju11

16
jingju11 发表于 2010-3-12 14:05:29
frackdeng 发表于 2010-3-12 13:46
我没理解错的话,应该就是把class排序而已,之后只要把X对应上去就可以了。在这里A对应1,4,8;B对应,5,2
14# jingju11
You are right. But as far as I can image, it is not a work of a couple of lines of coding. Why don't you just have a try.

17
frackdeng 发表于 2010-3-12 15:05:59
  1. data class;
  2. input x class $ @@;
  3. datalines;
  4. 1 A 4 A 8 A 5 B 2 B
  5. ;
  6. run;

  7. proc sort data=class;
  8. by class;
  9. run;

  10. %macro class;
  11. proc sql;
  12. select count(distinct class) into :class_n from class;
  13. select count(*) into :number from class ;
  14. quit;

  15. %let class_n=&class_n;
  16. %let number=&number;

  17. proc sql;
  18. select distinct class into :class1-:class&class_n from class;
  19. %do i=1 %to &class_n;
  20. select count(*) into :&&class&i from class where class="&&class&i";
  21. %end;
  22. quit;

  23. proc sql;
  24. create table test1 as
  25. select distinct
  26. %do i=1 %to &number-1;
  27. a&i..class as a&i,
  28. %end;
  29. a&number..class as a&number
  30. from
  31. %do i=1 %to &number-1;
  32. class as a&i,
  33. %end;
  34. class as a&number;
  35. quit;

  36. data test2;
  37. set test1;
  38. %do i=1 %to &class_n;
  39. n_&&class&i=0;
  40. %end;

  41. %do i=1 %to &number;
  42. %do j=1 %to &class_n;
  43. if a&i="&&class&j" then n_&&class&j=n_&&class&j+1;
  44. %end;
  45. %end;

  46. %do i=1 %to &class_n;
  47. if n_&&class&i=&&&&&&class&i;
  48. %end;
  49. run;

  50. data _null_;
  51. set test2 end=eof;
  52. if eof then call symput('total',_n_);
  53. run;

  54. proc transpose data=test2 out=test3;
  55. var
  56. %do i=1 %to &number;
  57. a&i
  58. %end;;
  59. run;

  60. %do i=1 %to &total;
  61. data class&i;
  62. set test3;
  63. obs=_n_;
  64. rename col&i=class;
  65. run;

  66. proc sort data=class&i;
  67. by class;
  68. run;

  69. data class&i;
  70. merge class class&i;
  71. by class;
  72. run;

  73. proc sort data=class&i out=class_&i(keep=x class);
  74. by obs;
  75. run;
  76. %end;

  77. %mend class;

  78. %class;
复制代码

16# jingju11

18
harlon1976 发表于 2010-3-12 19:26:11
jingju11 的程序可行,只是我的数据是16个,是7+9类型的,运算的时间比较长,不知是否还有更简洁的程序,同时也谢谢frackdeng 的程序。

19
harlon1976 发表于 2010-3-12 19:42:25
还有个问题请教,上面程序生成了10个数据集dest1-dest10,如何编写这样一个程序:随机生成1-10中的任意一个整数,比如是2则就调用数据集dest2。谢谢!

20
jingju11 发表于 2010-3-13 00:31:42
harlon1976 发表于 2010-3-12 19:42
还有个问题请教,上面程序生成了10个数据集dest1-dest10,如何编写这样一个程序:随机生成1-10中的任意一个整数,比如是2则就调用数据集dest2。谢谢!
调用是什么意思?

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

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