我正在寻找一种生成频率表的方法,该频率表显示每个变量ID
的唯一值来显示变量Subclass
的唯一值的数量。
我想按变量Class
对结果进行排序。
最好将每个ID
的{{1}}的唯一值的数量显示为Subclass
的n的分数。在下面的示例中,此值显示在%totalID下。
此外,我想显示每个ID
的{{1}}的唯一值的数量,作为每个ID
中发现的唯一Subclass
值的总和的一部分。在下面的求购示例中,此值显示在%withinclassID下。
拥有:
ID
想要:
Class
我最初的方法是在NLEVELS上执行PROC FREQ,从而生成一个频率表,用于每个子类的唯一ID数量。但是,我在这里失去了课堂信息。因此,我无法按班级排序结果。
我的第二种方法涉及使用PROC TABULATE。但是,我无法基于此类表中的唯一计数进行任何百分比计算。
是否有一种直接方法可以根据第二个变量将一个变量的频率制成表格,并按第三个变量分组显示总百分比或组百分比以内?
答案 0 :(得分:2)
您可以执行double proc freq或SQL。
/ *这演示了如何计算变量的唯一出现次数 跨群体。它使用任何SAS安装中都提供的SASHELP.CARS数据集。 目的是通过来源/
确定唯一汽车制造商的数量注意:如果您有大量数据集,则SQL解决方案可能会关闭,并且这不是计算非重复计数的唯一两种方法。 如果您要处理大型数据集,则可能需要其他方法。* /
*Count distinct IDs;
proc sql;
create table distinct_sql as
select origin, count(distinct make) as n_make
from sashelp.cars
group by origin;
quit;
*Double PROC FREQ;
proc freq data=sashelp.cars noprint;
table origin * make / out=origin_make;
run;
proc freq data=origin_make noprint;
table origin / out= distinct_freq outpct;
run;
title 'PROC FREQ';
proc print data=distinct_freq;
run;
title 'PROC SQL';
proc print data=distinct_sql;
run;
答案 1 :(得分:1)
在nlevels
语句中包含Class和Subclass变量,proc freq
中的by
选项可以产生所需的唯一计数而不会丢失数据。这也意味着您必须按相同的变量对数据进行预排序。
然后,您可以尝试proc tabulate
来满足其余要求。
data have;
input ID $ Class Subclass $;
datalines;
ID1 1 1a
ID1 1 1b
ID1 1 1c
ID1 2 2a
ID2 1 1a
ID2 1 1b
ID2 2 2a
ID2 2 2b
ID2 3 3a
ID3 1 1a
ID3 1 1d
ID3 2 2a
ID3 3 3a
ID3 3 3b
;
run;
proc sort data=have;
by class subclass;
run;
ods output nlevels = unique_id_count;
proc freq data=have nlevels;
by class subclass;
run;