假设我有一个数据集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个这样的变量。
谢谢
答案 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
值的频率计数,尽管这些值很有用,但在您的问题中并不是您想要的。