【问题标题】:SAS-Selecting Top Subjects- each with multiple rowsSAS-Selecting Top Subjects - 每个都有多行
【发布时间】:2016-01-05 15:54:04
【问题描述】:

我正在尝试从 200 个科目中选择前 10 个科目,每个科目可以有多行,并且每个科目都由 ID 变量唯一标识。数据按变量amount_paid(降序-美元金额)selection_flag(升序-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

我也尝试过 proc sql (outobs=10),但它只返回顶部行而不是顶部 ID 及其所有相关行。

所以理想情况下,我想选择前十个 id 及其各自的所有数据行,并保持按 amount_paid(升序)和 selection_group(降序)排序的顺序不变。对此的任何建议将不胜感激!

已经尝试过的示例代码:

创建 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;  

【问题讨论】:

  • 什么定义了“顶行”?如果一个 ID 有五行,每行 x 为 1,这算作最上面的行之一吗(如果 x=5 是一个最大值)?
  • 乔,我应该澄清一下,顶行首先由美元金额 X 定义,其次由 y 定义。
  • 您能发布一些您尝试过但不起作用的代码吗?并扩展示例数据以反映您的问题。
  • @Reeza,我已经添加了一些示例代码,并修改了数据,感谢您的帮助,如果您需要添加任何其他内容,请告诉我

标签: sorting sas grouping


【解决方案1】:

试试这个:

第 1 步:保存数据集的当前顺序

创建一个定义当前顺序的索引变量。

data ordered;
     set have;
     Order+1;
run;

输出:

ID   Order
191  1
101  2
101  3
750  4
250  5

您现在可以随意操作数据而不会丢失原始顺序。

第 2 步:删除重复 ID

您想要选择前 10 个 ID,但想要删除重复项。让我们按IDOrder 对其进行排序,将所有重复的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;

我们现在有了前 10 个 ID:

ID   Order
191  1
101  2
750  4
250  5

第 4 步:仅选择前 10 个 ID

我们将使用 Top_10_IDs 数据集作为键来查找主数据集中 ID 为前 10 名之一的所有行。

proc sql noprint;
    create table want as
        select *
        from have
        where ID IN(select ID from Top_10_IDs);
quit;

【讨论】:

    【解决方案2】:

    如果您只想要前 10 个 ID + 所有相关行(基于 ID):

    数据需要1; 设置 univ1 ; 按 ID 未排序; 如果 first.ID 则 id_cnt + 1 ; 如果 id_cnt

    【讨论】:

      猜你喜欢
      • 2020-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-19
      • 2013-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多