Sorting SAS选择顶级主题-每个主题有多行
我正在尝试从200个主题中选择前10个,每个主题可以有多行,每个主题由ID变量唯一标识。数据按变量amount_paid(美元金额降序)选择标志(升序1或2)排序。例如,当前数据如下所示,大约有200个唯一ID:Sorting SAS选择顶级主题-每个主题有多行,sorting,sas,grouping,Sorting,Sas,Grouping,我正在尝试从200个主题中选择前10个,每个主题可以有多行,每个主题由ID变量唯一标识。数据按变量amount_paid(美元金额降序)选择标志(升序1或2)排序。例如,当前数据如下所示,大约有200个唯一ID: ID amount_paid selection_flag group 191 $10 1 R3 101 $5 2 R2 101 $3
ID amount_paid selection_flag group
191 $10 1 R3
101 $5 2 R2
101 $3 2 R1
750 $2 2 R0
250 $1 2 R0
我尝试过选择不同的ID、分配枚举、合并回去,以及只选择数字等于或小于10的ID。例如:
ID number
191 1
101 2
101 2
750 3
250 4
But using distinct changes the order of IDs:
ID number
101 1
101 1
191 2
250 3
750 4
我也尝试过procsql(outobs=10),但它只返回最上面的行,而不是最上面的id及其所有相关行
因此,理想情况下,我希望选择前十个ID及其各自的数据行,并保持按支付金额(升序)和选择组(降序)排序的顺序不变。如果您对此有任何建议,我们将不胜感激
已尝试的示例代码:
创建universe的代码(创建选择标志,因为需要所有R3、R4和R5(如果在数据中):
PROC SQL;
CREATE TABLE WORK.univ1 AS
SELECT distinct t1.*,
/* Selection Flag */
(case when group in ('R3','R4','R5') then 1 else 2 end) As selection_flag
FROM RawData t1 Left Join Value_Cde_Excl t2 ON (t1.ID = t2.ID)
Left Join Cond_Cde_Excl t3 ON (t1.ID= t3.CH_ICN)
Left Join Diag_Excl t4 ON (t1.ID = t4.CH_ICN)
WHERE t1.y BETWEEN 'R0' AND 'RZ' AND
t1.ID NE t2.ID AND
t1.ID NE t3.ID AND
t1.ID NE t4.ID
ORDER BY Selection_Flag,
Amt_Paid DESC,
ID;
QUIT;
Code to pull distinct ids (loses order):
PROC SQL;
CREATE TABLE WORK.sample AS
SELECT distinct ID
FROM univ1;
QUIT;
Code to put distinct ids in a macro (loses order):
/*Create a macro variable of all ICNs */
proc sql noprint;
select distinct ID
into :ID_LIST separated by ' '
from univ1;
quit;
code to select top 10 observations (keeps order, but has duplicated ids)
PROC SQL outobs=10;
CREATE TABLE WORK.sample AS
SELECT ID
FROM univ1;
QUIT;
试试这个:
步骤1:保存数据集的当前顺序
创建一个索引变量,该变量定义当前的顺序
data ordered;
set have;
Order+1;
run;
输出:
ID Order
191 1
101 2
101 3
750 4
250 5
现在,您可以随心所欲地操作数据,而不会丢失原始顺序
步骤2:删除重复ID
您希望选择前10个ID,但希望删除重复的ID。让我们按ID
和Order
对其进行排序,以将所有重复的ID放在一起
proc sort data=ordered
by ID Order;
run;
您的数据集应如下所示:
ID Order
101 2
101 3
191 1
250 5
750 4
我们希望保留每个ID的第一个观察值。我们可以通过两种方式删除重复项:通过数据步骤,或另一个带有equals
选项的proc sort
语句。我们将使用另一个proc sort
,因为它有dupout
选项
proc sort data=ordered
out=ordered_nodupes
dupout=dupes
nodupkey
equals;
by ID;
run;
您现在应该有两个数据集:
Ordered_NoDupes
ID Order
101 2
191 1
250 5
750 4
__________
Dupes
ID Order
101 3
步骤3:按原始顺序排序
最后,按原始顺序排序,只保留前10个观察值
proc sort data=ordered_nodupes
out=Top_10_IDs(obs=10);
by order;
run;
我们现在有了十大ID:
ID Order
191 1
101 2
750 4
250 5
步骤4:仅选择前10个ID
我们将使用Top_10_ID
dataset作为一个键,查找主数据集中ID为Top 10之一的所有行
proc sql noprint;
create table want as
select *
from have
where ID IN(select ID from Top_10_IDs);
quit;
如果只需要前10个ID+所有关联行(基于ID): 数据want1; 设置univ1; 按ID排序; 如果首先是ID,则ID_cnt+1;
如果id_cnt什么定义了“顶行”?如果id有五行,每行x中有1行,那么这是否算作顶行之一(如果x=5是顶值)?Joe,我应该澄清一下,最上面的行首先由美元金额X定义,然后由y定义。您能发布一些您尝试过但不起作用的代码吗?并扩展示例数据以反映您的问题。@Reeza,我已经添加了一些示例代码和修改的数据,谢谢您的帮助,如果您还需要添加其他内容,请告诉我 data want1 ; set univ1 ; by ID notsorted ; if first.ID then id_cnt + 1 ; if id_cnt <= 10 then output ; run ;