用于以下场景的SAS

用于以下场景的SAS,sas,duplicates,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

假设我有一个数据集
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的值作为具有相同ID的
D1
中记录的最大值(各自变量的值)。例如
D2
中的ID=1具有ATR1=max(23,19)=23

我有一个非常笨拙的解决办法。我只需对数据集'D1'的副本进行三次排序(例如按ID和ATR1),然后删除重复项。稍后,我将合并这三个数据集以获得所需的内容。然而,我认为可能有一个优雅的方式来做到这一点。我在原始数据集中有大约20个这样的变量


谢谢

PROC-SQL方法

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;
PROC SUMMARY DATA=D1 NWAY;
             CLASS ID;
             VAR ATR1 ATR2 ATR3;
             OUTPUT OUT=D2 (DROP=_TYPE_ _FREQ_) MAX()=;
RUN;
groupby
子句也可以写入
groupby 1
,省略
ID
,因为这是指
SELECT
子句中的第一列

过程汇总方法

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;
PROC SUMMARY DATA=D1 NWAY;
             CLASS ID;
             VAR ATR1 ATR2 ATR3;
             OUTPUT OUT=D2 (DROP=_TYPE_ _FREQ_) MAX()=;
RUN;
以下是一些选项的说明:

  • NWAY
    -只给出了最大的汇总级别,这里没有那么重要,因为您只有一个
    变量,这意味着只有一个汇总级别。但是,如果没有
    NWAY
    ,您将获得一个额外的行,显示整个数据集中
    ATR1-ATR3
    的最大值,这不是您在问题中要求的

  • DROP=\u TYPE\u\u FREQ\u
    -这将删除自动变量:

    • \u TYPE \
      -显示汇总级别(见上文注释),该列仅包含值
      1
    • \u FREQ\u
      -给出
      ID
      值的频率计数,虽然有用,但在您的问题中并不是您想要的

    • 过程SQL方法

      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;
      
      PROC SUMMARY DATA=D1 NWAY;
                   CLASS ID;
                   VAR ATR1 ATR2 ATR3;
                   OUTPUT OUT=D2 (DROP=_TYPE_ _FREQ_) MAX()=;
      RUN;
      
      groupby
      子句也可以写入
      groupby 1
      ,省略
      ID
      ,因为这是指
      SELECT
      子句中的第一列

      过程汇总方法

      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;
      
      PROC SUMMARY DATA=D1 NWAY;
                   CLASS ID;
                   VAR ATR1 ATR2 ATR3;
                   OUTPUT OUT=D2 (DROP=_TYPE_ _FREQ_) MAX()=;
      RUN;
      
      以下是一些选项的说明:

      • NWAY
        -只给出了最大的汇总级别,这里没有那么重要,因为您只有一个
        变量,这意味着只有一个汇总级别。但是,如果没有
        NWAY
        ,您将获得一个额外的行,显示整个数据集中
        ATR1-ATR3
        的最大值,这不是您在问题中要求的

      • DROP=\u TYPE\u\u FREQ\u
        -这将删除自动变量:

        • \u TYPE \
          -显示汇总级别(见上文注释),该列仅包含值
          1
        • \u FREQ\u
          -给出
          ID
          值的频率计数,虽然有用,但在您的问题中并不是您想要的