【问题标题】:SAS, Filtering for Highest ValuesSAS,过滤最大值
【发布时间】:2015-10-10 22:51:53
【问题描述】:

我目前有一个评分为 0-6 的健康伤害数据集,其中 0 表示无伤害,6 表示致命伤害。这涉及 6 个分类身体区域变量。我正在尝试构建一个缩写伤害量表,其中将考虑观察中的三个最高分数进行计算。如何过滤SAS每行中最高的三个?下面是一个例子:

ID A B C D E F

1 0 0 0 3 4 0

2 1 2 1 4 0 0

3 0 0 5 0 0 0

4 1 2 1 5 4 0

所以在 OBS 1 中,将使用分数 3、4 和 0; OBS 2 - 4、2 和 1; OBS 3 - 5、0 和 0; OBS 4 - 5、4、2。

【问题讨论】:

  • 或最大函数。
  • 或转置为每个身体区域有 1 条记录(每个主题 ID 6 条记录)。

标签: sas


【解决方案1】:

我在下面提供了代码来满足您的要求,并详细说明了步骤,您应该能够针对许多选项/用途对其进行修改。

基本上,它会获取您的数据,按照 Quentin 的建议进行转置,然后使用 proc 方法输出每个 ID 的前 3 个观察值。

DATA NEW;
INPUT ID A B C D E F;
CARDS;
1 0 0 0 3 4 0
2 1 2 1 4 0 0
3 0 0 5 0 0 0
4 1 2 1 5 4 0
RUN;

PROC TRANSPOSE DATA=NEW OUT=T_OUT(RENAME=(_NAME_ = VARIABLE COL1=VALUES));
BY ID;
VAR A B C D E F;
PROC PRINT DATA=T_OUT;
RUN;

PROC MEANS DATA=T_OUT NOPRINT;
CLASS ID;
TYPES ID;
VAR VALUES;
OUTPUT OUT=TOP3LIST(RENAME=(_FREQ_=RANK VALUES_MEAN=INDEX_CRITERIA))SUM= MEAN=
    IDGROUP(MAX(VALUES) OUT[3] (VALUES VARIABLE)=)/AUTOLABEL AUTONAME;
PROC PRINT DATA=TOP3LIST;
RUN;

***THEN YOU CAN MERGE THIS DATA SET TO YOUR ORIGINAL ONE BY ID TO GET YOUR INDEX CRITERIA ADDED TO IT***;
***THE INDEX_CRITERIA IS A MEAN FROM PROC MEANS BEFORE THE KEEPING OF JUST THE TOP3 VALUES***;
DATA FINAL (DROP=_TYPE_ RANK VALUES_Sum VALUES_1 VALUES_2 VALUES_3 VARIABLE_1 VARIABLE_2 VARIABLE_3);
MERGE NEW TOP3LIST;
INDEX_CRITERIA2=SUM(VALUES_1, VALUES_2, VALUES_3)/3; *THIS CRITERIA IS AVERAGE OF THE KEPT 3 VALUES;
BY ID;
PROC PRINT DATA=FINAL;
RUN;

最好的问候, 约翰

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 2017-02-16
    • 1970-01-01
    相关资源
    最近更新 更多