用于以下场景的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
-只给出了最大的汇总级别,这里没有那么重要,因为您只有一个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;
以下是一些选项的说明: