如何计算SAS中组内字符串变量的模式?

如何计算SAS中组内字符串变量的模式?,sas,proc-sql,Sas,Proc Sql,我可以在proc sql中使用子查询计算模式,但这是最简单的方法吗?此代码通过依赖于proc sql中的max函数来处理计算模式时可能出现的连接 ods html file = "sas_output.html"; data raw_data; input cust_id $ category $ amount; datalines; A red 72.83 A red 80.22 A blue 0.2 A blue 33.62 A blue 30.63 A gr

我可以在
proc sql
中使用子查询计算模式,但这是最简单的方法吗?此代码通过依赖于
proc sql
中的
max
函数来处理计算模式时可能出现的连接

ods html file = "sas_output.html";

data raw_data;
 input cust_id $
       category $
       amount;
datalines;
A red 72.83
A red 80.22
A blue 0.2
A blue 33.62
A blue 30.63
A green 89.04
B blue 10.29
B red 97.07
B red 68.71
B red 98.2
B red 1.79
C green 92.94
C green 0.96
C red 15.23
D red 49.94
D blue 75.82
E blue 20.97
E blue 78.49
F green 87.92
F green 32.29
;
run;

proc sql;
  create table modes as 
    select cust_id, mean(amount) as mean_amount, category as mode_category
    from (
            select *, count(1) as count from raw_data group by cust_id, category
         )
    group by cust_id
    having count=max(count)
    order by cust_id;
quit;

data modes;
    set modes;
    by cust_id;
    if first.cust_id then output;
run;

data final_data;
    merge raw_data modes;
    by cust_id;
run;

proc print data=final_data noobs;
    title "final data";
run;

ods html close;
我试着像这样使用
proc means

proc means data=raw_data;
    class cust_id;
    var category;
    output out=modes mode=mode_category;
run;

但我得到错误“列表中的变量类别不匹配为此列表指定的类型”,因为
proc意味着
不支持字符变量

SQL无疑是一种很好的方法。这是一个双精度的数据步解决方案。如果需要,也可以在同一步骤中使用此方法计算平均值

对数据进行排序,以便按组使用

proc sort data=raw_data;
  by cust_id category;
run;
读取数据集一次,按客户id计算类别的每次出现次数。变量
maxfreq
存储最高计数,变量
mode
保留计数最高的类别。由于数据是按类别变量排序的,因此在出现断开连接的情况下,将返回按字母顺序排列的最高值

第二个循环输出第一个循环的值和模式

data want(drop=freq maxfreq);
  do until (last.cust_id);
    set raw_data;
    by cust_id category;
    if first.category then freq=0;
    freq+1;
    maxfreq=max(freq,maxfreq);
    if freq=maxfreq then mode=category;
  end;
  do until (last.cust_id);
    set raw_data;
    by cust_id;
    output;
  end;
run;

我认为您的SQL方法很好。这是几个步骤,但也很容易遵循。除非你的数据集很大,而且你的问题是性能,否则我会保持现状。@RobertPenridge我可能会坚持使用SQL,尽管我也从下面的答案中学到了很多。性能不是问题,因为即使我的数据集有超过4亿个观察值,运行它只需要大约20分钟,这对我来说很好(这是一个数据准备步骤,所以只运行一次)。