SAS用于以下方案

时间:2016-06-20 01:10:21

标签: sas duplicates

假设我有一个数据集D1,如下所示:

ID    ATR1    ATR2    ATR3  
1     23      10      11
2     22      11      14
1     19      14      15
2     34      6       17
3     10      11      5 

我想从中创建一个数据集D2,如下所示

ID    ATR1    ATR2    ATR3  
1     23      14      15
2     34      11      17
3     10      11      5 

换句话说,数据集D2由来自D1的唯一ID组成。对于D2中的每个ID,选择ATR1-ATR3的值作为D1中具有相同ID的记录中的最大值(相应变量)。例如,D2中的ID = 1具有ATR1 = max(23,19)= 23。

我有一个非常笨拙的解决方案。我只是简单地对数据集“D1'”的副本进行排序。三次(按ID和ATR1例如)并删除重复项。我后来合并了三个数据集以获得我想要的东西。但是,我认为可能有一种优雅的方式来做到这一点。我在原始数据集中有大约20个这样的变量。

谢谢

1 个答案:

答案 0 :(得分:0)

PROC SQL METHOD

PROC SQL;
  CREATE TABLE D2 AS
  SELECT ID,
  MAX(ATR1) as ATR1,
  MAX(ATR2) as ATR2,
  MAX(ATR3) as ATR3,
  FROM D1
  GROUP BY ID;
QUIT;

GROUP BY子句也可以写成GROUP BY 1,省略ID,因为它引用SELECT子句中的第1列。

PROC SUMMARY METHOD

PROC SUMMARY DATA=D1 NWAY;
             CLASS ID;
             VAR ATR1 ATR2 ATR3;
             OUTPUT OUT=D2 (DROP=_TYPE_ _FREQ_) MAX()=;
RUN;

以下是对一些选项的解释:

  • NWAY - 仅提供最高级别的摘要,此处它并不重要,因为您只有一个CLASS变量,这意味着只有一个级别的摘要。但是,如果没有NWAY,您会在整个数据集中显示一个额外的行,显示ATR1-ATR3的最大值,这不是您在问题中要求的内容。

  • DROP=_TYPE_ _FREQ_ - 这会删除自动变量:

    • _TYPE_ - 显示摘要级别(请参阅上面的评论),它只是一个包含值1的列。
    • _FREQ_ - 提供ID值的频率计数,尽管这些值很有用,但在您的问题中并不是您想要的。