楼主: 08liurenxing
4379 19

[原创博文] 求教 生成频数表 [推广有奖]

11
jingju11 发表于 2010-3-23 05:52:43
08liurenxing 发表于 2010-3-22 23:53
谢谢了,但是因为我导入的数据集是很大的,变量是X1-X10。而且观测值6百多个,虽然都是1.2.3.4。所以不能直接输入成X,有没有其他方法啊?

  1. DATA A;
  2. input x1 x2 x3 X4 X5;
  3. cards;
  4. 1 2 3 4 4
  5. 2 3 4 1 4
  6. 3 2 1 4 1
  7. 1 2 3 4 1

  8. %MACRO KK;
  9. DATA B;
  10.   LENGTH Level 8;
  11.   SET A END = Eof;
  12.   ARRAY X{&Nvar};
  13.   %DO I = 1 %TO 4; ARRAY X&I._{&Nvar}; %END;
  14.   DO _N_ = 1 TO DIM(X);
  15.    %DO I = 1 %TO 4; X&I._[_N_]+(X[_N_] = &I); %END;
  16.   END;
  17.   ARRAY _X{&Nvar};
  18.   IF  Eof THEN DO;
  19.    %DO I = 1 %TO 4;
  20.      Level = &I;
  21.      DO _N_ = 1 TO &Nvar;
  22.       _X[_N_] = X&I._[_N_];
  23.      END;
  24.      OUTPUT;
  25.    %END;
  26.   END;
  27. KEEP Level _X:;
  28. RUN;
  29. %MEND KK;
  30. %LET Nvar = 5;
  31. %KK
  32. ;
复制代码

我是闲的无聊。楼上用FREQ是最好的方法。致敬。

12
gzjb 发表于 2010-3-23 08:57:51
08liurenxing 发表于 2010-3-22 23:53
谢谢了,但是因为我导入的数据集是很大的,变量是X1-X10。而且观测值6百多个,虽然都是1.2.3.4。所以不能直接输入成X,有没有其他方法啊?
You need table

Level _X1 _X2 _X3 _X4 _X5
1             1      2    0     1      1     2
2             2       1   3     0      0     0
3              3      1    1    2     0     0
4              4       0   0    1     3     2

13
08liurenxing 发表于 2010-3-23 09:06:05
非常感谢楼上两位高手,我都试了一下,jingju11跑出来就是我想要的,最后跑出来的表是
Obs Level _X1 _X2 _X3 _X4 _X5
1             1      2    0     1      1     2
2             2       1   3     0      0     0
3              3      1    1    2     0     0
4              4       0   0    1     3     2

这个就是我想要的表格,非常感谢

14
08liurenxing 发表于 2010-3-23 09:09:47
不过程序太复杂,看不懂都,哎呀,啥时候我要是会熟练写宏就好了。

15
gzjb 发表于 2010-3-23 11:55:42
08liurenxing 发表于 2010-3-23 09:09
不过程序太复杂,看不懂都,哎呀,啥时候我要是会熟练写宏就好了。
Give you  a simple code without macro.
DATA test;;
input x1 x2 x3 X4 X5;
cards;
1 2 3 4 4
2 3 4 1 4
3 2 1 4 1
1 2 3 4 1
;

data freq(keep=level freq1-freq5);
  set test end=last;
  array tpvar{5} x1-x5;
  array myfre{4,5} _temporary_  (0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
  do i=1 to dim(tpvar);
       myfre{tpvar{i},i }=myfre{tpvar{i},i }+1;
  end;
  if last then do;
    do level=1 to 4 ;
       freq1=myfre{level,1}; freq2=myfre{level,2};
       freq3=myfre{level,3};freq4=myfre{level,4}; freq5=myfre{level,5};
       output;
    end;
    end;
run;

proc print noobs;  run;

16
frackdeng 发表于 2010-3-23 12:50:55
  1. data test;
  2.     input x1 x2 x3 x4;
  3.         datalines;
  4.         1 1 1 1
  5.         1 1 2 1
  6.         2 1 3 1
  7.         2 3 3 1
  8.         3 4 2 1
  9.         3 2 4 1
  10.         4 2 1 1
  11.         ;
  12. run;

  13. data x;
  14.     input x @@;
  15.         datalines;
  16.         1 2 3 4
  17.         ;
  18. run;

  19. %macro count(n=2);/n=变量个数
  20. %do i=1 %to &n;
  21. proc sql;
  22.     create table x&i as
  23.         select x&i as x,count(x&i) as x&i
  24.         from test
  25.         group by x&i
  26.     order by x;
  27. quit;

  28. data x;
  29.    merge x x&i;
  30.    by x;
  31. run;
  32. %end;
  33. %mend count;

  34. %count(n=4);
复制代码

17
soporaeternus 发表于 2010-3-23 13:06:32
这种类型的数据统计,hash是最快的,而且不受变量取值分布(这里是4个值)的约束
Let them be hard, but never unjust

18
jingju11 发表于 2010-3-23 21:23:22
  1. %MACRO FREQmcr;
  2. DATA FINAL;
  3.   LENGTH LEVEL X1-X&Nvar 8;
  4.   RETAIN X1-X&Nvar 0;
  5.   DO Level = 1 TO 4;
  6.    OUTPUT;
  7.   END;
  8. RUN;
  9. %DO I = 1 %TO &Nvar;
  10.   ODS OUTPUT
  11.   ONEWAYFREQS = OUT(KEEP=X&I  FREQUENCY RENAME=(X&I=Level FREQUENCY=X&I));
  12.   PROC FREQ DATA = A;
  13.    TABLES X&I;
  14.   RUN;
  15.   DATA FINAL;
  16.    MERGE FINAL OUT;
  17.    BY Level;
  18.   RUN;
  19. %END;
  20. ODS OUTPUT CLEAR;
  21. %MEND FREQmcr;
复制代码
I like to use proc freq

19
08liurenxing 发表于 2010-3-24 14:27:21
感激各位高手,能跑出结果了,全部理解并且学会还需要一点时间

20
crazygoing 发表于 2010-4-20 16:25:54
1# 08liurenxing

  1. data a;
  2. input x1 x2 x3 x4 x5;
  3. cards;
  4. 1 2 3 4 4
  5. 2 3 4 1 4
  6. 3 2 1 4 1
  7. 1 2 3 4 1
  8. ;
  9. run;
  10. data b;
  11. set a;
  12. n=_n_;
  13. run;
  14. proc transpose data=b out=c;
  15. var x1-x5;
  16. by n;
  17. run;
  18. proc freq data=c;
  19. table col1*_name_;
  20. run;
复制代码


利用转置功能也能实现,程序较简单些。

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-2 05:51