Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting SAS选择顶级主题-每个主题有多行_Sorting_Sas_Grouping - Fatal编程技术网

Sorting SAS选择顶级主题-每个主题有多行

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

我正在尝试从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                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 ;