楼主: burnpark
15789 10

[问答] 关于proc freq的问题 [推广有奖]

  • 1关注
  • 2粉丝

讲师

21%

还不是VIP/贵宾

-

威望
0
论坛币
2979 个
通用积分
6.6000
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
4270 点
帖子
128
精华
0
在线时间
591 小时
注册时间
2009-3-17
最后登录
2024-10-13

100论坛币
我想按组统计多个变量的频数。
比如我有数据test。内容如下:
ID a b c d ...
1 10 30 10 20
1 10 10 10 15
2 15 20 10 10
3 10 15 15 15
3 20 15 20 10
3 10 15 20 10
4 15 20 15 15
4 10 10 15 15
5 20 10 30 10
...
一般来说
proc freq data=test;
table a;
run;
这样的话 ID1的 10这个值是两个,
可是我想要的结果是如果同样ID的变量值相同的话只算一个。
就是说proc freq后变量a的结果是
10这个值会出现3次而不是5,
而变量b的15这个值会出现1次而不是3。
变量有很多从a~z,在data步一个变量一个变量去除重复很麻烦,而且花时间。
ods也试过数据太大,机器带不动。请问有没有更有效率的方法?

最佳答案

huntdreamer 查看完整内容

data test; input ID a b c d@@; cards; 1 10 30 10 20 1 10 10 10 15 2 15 20 10 10 3 10 15 15 15 3 20 15 20 10 3 10 15 20 10 4 15 20 15 15 4 10 10 15 15 5 20 10 30 10 ; run; proc sql; select b, count(b) as count from (select distinct ID,b from test) group by b ; quit;
关键词:freq Fre REQ ROC Table 统计
沙发
huntdreamer 发表于 2014-1-21 13:08:53 |只看作者 |坛友微信交流群
data test;
input ID a b c d@@;
cards;
1 10 30 10 20
1 10 10 10 15
2 15 20 10 10
3 10 15 15 15
3 20 15 20 10
3 10 15 20 10
4 15 20 15 15
4 10 10 15 15
5 20 10 30 10
;
run;
proc sql;
select b, count(b) as count
from
(select distinct ID,b
from test)
group by b
;
quit;

使用道具

藤椅
huntdreamer 发表于 2014-1-21 13:34:44 |只看作者 |坛友微信交流群
按照你上面表达,ID 相同情况下只计算一次的话,10只出现了3次!

使用道具

板凳
burnpark 发表于 2014-1-21 13:38:28 |只看作者 |坛友微信交流群
不好意思,是3次

使用道具

报纸
huntdreamer 发表于 2014-1-21 13:53:27 |只看作者 |坛友微信交流群
a,b,c,d....你替换下就行了

使用道具

地板
tracymicky 发表于 2014-1-21 14:06:36 |只看作者 |坛友微信交流群
我的理解是这样的:如果ID和a一样的 不管其他变量是否相同,楼主只想保留第一次出现的observation,然后统计?如果我的理解是对的,可以使用proc sort的nodupkey选项,之后再用proc freq:
data test;
input ID a b c d@@;
cards;
1 10 30 10 20
1 10 10 10 15
2 15 20 10 10
3 10 15 15 15
3 20 15 20 10
3 10 15 20 10
4 15 20 15 15
4 10 10 15 15
5 20 10 30 10
;
run;

proc sort data=test nodupkey out=test1;
by ID a;
run;

proc freq data=test1;
table a;
run;

使用道具

7
weitingkoala 发表于 2014-1-21 14:08:12 |只看作者 |坛友微信交流群
在上面哥们基础上假如宏,就可以做完a-z了
首先:建立外部宏文本 aaa.txt,文本内容为  %solution(a);  ......  %solution(z);
其次,建立宏:
data test;
input ID a b c d@@;
cards;
1 10 30 10 20
1 10 10 10 15
2 15 20 10 10
3 10 15 15 15
3 20 15 20 10
3 10 15 20 10
4 15 20 15 15
4 10 10 15 15
5 20 10 30 10
;
run;
%macro solution(letter);
proc sql;
select &letter., count(&letter.) as count
from
(select distinct ID,&letter.
from test)
group by &letter.
;
quit;
%mend solution;
最后,调用宏文本:
%include "C:\Documents and Settings\Administrator\桌面\aaa.txt"
没运行过 仅提供思路

使用道具

8
mycpcw 发表于 2014-1-21 18:29:56 |只看作者 |坛友微信交流群

使用道具

9
yongyitian 发表于 2014-1-22 09:26:53 |只看作者 |坛友微信交流群
  1. data test;
  2. input ID a b c d;
  3. cards;
  4. 1 10 30 10 20
  5. 1 10 10 10 15
  6. 2 15 20 10 10
  7. 3 10 15 15 15
  8. 3 20 15 20 10
  9. 3 10 15 20 10
  10. 4 15 20 15 15
  11. 4 10 10 15 15
  12. 5 20 10 30 10
  13. ; run;

  14. proc sql;   
  15.     select name into :varname separated by ' '
  16.        from dictionary.columns
  17.        where libname = 'WORK' and memname='TEST' and name ^='ID';
  18.        select count(name) into : n_var
  19.        from dictionary.columns
  20.        where libname = 'WORK' and memname='TEST' and name ^='ID';
  21. quit;

  22. %macro mymacro;
  23.     %do i = 1 %to   &n_var;
  24.     %let var=%scan(&varname, &i);  %put &var;
  25.        proc sql;
  26.           create table &var as
  27.           select distinct ID, &var as num, "&var" as variable, count(*) as count
  28.           from test
  29.           group by id, &var;
  30.        quit;
  31.        proc append  base=want data=&var;
  32.        run;
  33.     %end;
  34. %mend;
  35. %mymacro;

  36. /* use proc freq */
  37. proc freq data=test;
  38.     table ID*a / nopercent norow nocol out=freq_a (drop=percent rename=(count=count_a));
  39.     table ID*b / nopercent norow nocol out=freq_b (drop=percent rename=(count=count_b));
  40.     table ID*c / nopercent norow nocol out=freq_c (drop=percent rename=(count=count_c));
  41.     table ID*d / nopercent norow nocol out=freq_d (drop=percent rename=(count=count_d));
  42. run;
复制代码

使用道具

10
jingju11 发表于 2014-1-22 10:49:31 |只看作者 |坛友微信交流群
  1. data t;
  2. set sashelp.class;
  3. w =round(weight, 10);
  4. h =round(height, 10);
  5. run;

  6. %let varList =name age w h;
  7. %let FvarList=;
  8. %macro makeFvarList;
  9.         %do i =1 %to %sysfunc(countw(&varList));
  10.                 %let FvarList =&FvarList F_%scan(&varList, &i);
  11.                 %end;
  12. %mend makeFvarList;
  13. %makeFvarList;

  14. proc freq data =t;
  15. ods output crosstabfreqs =ctf(where =(_type_ ='11' & frequency));
  16.         tables sex*(&varList)/nopercent nocol norow;
  17.         run;

  18. proc freq data =ctf(keep =&VarList _type_ frequency );
  19. ods output onewayfreqs =ctf2;
  20.         tables &varList/nopercent nocol norow nocum;
  21.         run;

  22. data ctf3;
  23.         set ctf2(keep =table &FvarList Frequency );
  24.         var =scan(table, -1);
  25.         val =cats(of &FvarList);
  26.         run;
复制代码

使用道具

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

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

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

GMT+8, 2024-11-6 03:45