为SAS中的每个ID查找最频繁的变量

为SAS中的每个ID查找最频繁的变量,sas,frequency,Sas,Frequency,我的数据集如下所示: ID X 769 "c" 769 "f" 769 "c" 1632 "a" 1632 "a" 1632 "b" 1632 "g" 1632 "a" 我需要的是为每个ID找到最频繁的X,以便生成的数据集为: ID X 769 "c" 1632 "a" 如有任何反馈,将不胜感激 PROC SQL MAX()函数适用于字符变量,因此它是一个快速解决方案 proc sql; create table want as select id

我的数据集如下所示:

ID     X
769   "c"
769   "f"
769   "c"
1632  "a"
1632  "a"
1632  "b"
1632  "g"
1632  "a"
我需要的是为每个ID找到最频繁的X,以便生成的数据集为:

ID     X
769   "c"
1632  "a"
如有任何反馈,将不胜感激

PROC SQL MAX()函数适用于字符变量,因此它是一个快速解决方案

proc sql;
create table want as
select id, max(x) as max_a
from have
group by id;
quit;
编辑:使用基本SAS和PROC排序的替代解决方案。使用降序选项对数据进行排序,并获取每个ID的第一条记录

Proc freq data=have;
Table id*x/out=count;
 Run;

proc sort data=count;
by ID descending count;
run;

data want;
set have;
by id;
if first.id;
run;

重新考虑使用派生表子查询的
proc sql
解决方案:

proc sql;
   create table Output as   
   select id, x as freqx
   from
      (select id, x, count(x) as lettercount
       from example 
       group by id, x)  
   group by id
   having lettercount = max(lettercount);
quit;

好的,您可以使用proc freq和其他一些步骤来完成这项工作

首先,要创建您的数据:

data have;
format id $10. x $1.;
infile datalines dsd missover dlm='|';
input id $ x $;
datalines;
769|c
769|f
769|c
1632|a
1632|a
1632|b
1632|g
1632|a
;
run;

proc sort data=have;
by id;
run;
现在我们将看到ID的每个X的频率,并将结果输出到表“几乎想要”

然后,我们仅对X具有较高计数的值进行子集:

proc sort data=almost_want;
by id count;
run;

data want;
    set almost_want;
    by id;
    if last.id then output;
run;

OBS:我的Id变量是字符,所以您想根据需要调整它。

proc sql max函数适用于字符变量。您是说Id=1632的“g”吗?按字典顺序,“a”应该是最低的。不要按字典顺序思考,而是询问哪个字母出现得最多。如果有联系,你希望返回什么?还没有决定,但任何一个联系现在都可以。抱歉,我认为这是可行的,但它真正的作用是按字母顺序返回最后一个字母,不是最常见的信。我最初的问题措辞拙劣。我更新了它。有没有快速更新答案的方法?
proc sort data=almost_want;
by id count;
run;

data want;
    set almost_want;
    by id;
    if last.id then output;
run;