繁体   English   中英

如何在 SAS Enterprise Guide / PROC SQL 中创建具有值降序排列的名称的新列?

[英]How to create new columns with names of columns with values in descending order in SAS Enterprise Guide / PROC SQL?

我在 SAS 企业指南中有如下表格:

ID   | COL_A | COL_B | COL_C
-----|-------|-------|------
111  | 10    | 20    | 30
222  | 15    | 80    | 10
333  | 11    | 10    | 20
444  | 20    | 5     | 20

要求:

  • 我需要创建新列:TOP_1、TOP_2、TOP_3,其中列的名称将从 COL_A、COL_B、COL_C 列的最高值到每个 ID 的最低值

  • 例如,如果 2 个或更多列具有相同的最高值,则取字母表下的第一个。

  • 在 TOP_1 中 - 每个 ID 具有最高值的列的名称在 TOP_2 - 每个 ID 具有第二高值的列的名称在 TOP_3 - 每个 ID 具有第三高值的列的名称

欲望 output:

ID   | COL_A | COL_B | COL_C  | TOP_1  | TOP_2   | TOP_3
-----|-------|-------|--------|--------|---------|--------- 
111  | 10    | 20    | 30     | COL_C  | COL_B   | COL_A
222  | 15    | 80    | 10     | COL_B  | COL_A   | COL_C
333  | 11    | 10    | 20     | COL_C  | COL_A   | COL_B
444  | 20    | 5     | 20     | COL_A  | COL_C   | COL_B

因为:

  • 对于 ID = 111,最高值在 COL_C 中,共同名称“COL_C”转到“TOP_1”列,第二大值在 COL_B 中,因此名称“COL_B”转到“TOP_2”列,依此类推...
  • 对于 ID = 444 两列具有最高值,因此我们必须使用字母标准,并且在“TOP_1”列中名称“COL_A”和名称“COL_B”在列“TOP_2”中

我怎样才能在 SAS Enterprise Gude 或 PROC SQL 中做到这一点?

首先让我们将您的列表转换为实际数据集。

data have;
  input ID    COL_A  COL_B  COL_C ;
cards;
111   10     20     30
222   15     80     10
333   11     10     20
444   20     5      20
;

如果您使用 PROC TRANSPOSE 将您的 COL_: 转换为观察结果。

proc transpose data=have out=tall;
  by id col_a col_b col_c;
  var col_a col_b col_c;
run;

然后,您可以按降序值(和升序变量名称)排序:

proc sort;
  by id col_a col_b col_c descending col1 _name_;
run;

并使用另一个 PROC TRANSPOSE 来创建新变量:

proc transpose data=tall out=want(drop=_name_ _label_) prefix=TOP_;
  by id col_a col_b col_c;
  var _name_;
run;

如果数据非常大(或者您要检查的列多于 3 列),您可能希望从 BY 组中删除 COL_A COL_B 和 COL_C,而只是将生成的 TOP_: 变量合并回原始数据集。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM