【问题标题】:SAS 9.3 Proc Rank AlternativesSAS 9.3 Proc Rank 替代方案
【发布时间】:2013-12-12 18:51:04
【问题描述】:

我有一个导入的 excel 文件,DATASET 看起来像:

    Family       Weight
    1             150
    1             210   
    1             99
    2             230
    2             100
    2             172

我需要找到每个家庭的等级总和。
我知道我可以使用 PROC RANK 轻松做到这一点,但这是一个硬件问题,我可以使用的 only PROC 语句是 PROC Means。我什至不能使用 Proc Sort。

排名如下(最低权重获得排名 = 1,等等)

99 - 排名 = 1
100 - 排名 = 2
150 - 排名 = 3
172 - 排名 = 4
210 - 排名 = 5
230 - 排名 = 6

结果数据集:

    Family       Sum_Ranking
    1             9
    2             12

家庭 1 Sum_Ranking 由 (3+5+1) 计算得出
Family 2 Sum_Ranking 的计算公式为 (6+2+4)

感谢您的帮助。

【问题讨论】:

  • 到目前为止,您尝试了什么?我认为你甚至不需要 PROC MEANS 来解决这个问题。除非您的硬件要求您至少使用一次 PROC MEANS,否则您可以单独在 DATA 步骤中执行此操作。
  • 实际上,通过 PROC MEANS 执行此操作是一个非常有趣的问题。仅在没有 PROC SORT 的情况下使用数据步骤是相当困难的 - 您必须进行一些数组操作,这可能超出了像这样的可能较低级别的类的范围。

标签: sas ranking


【解决方案1】:

我不会给你代码,而是一些提示。

具体来说,指令中最有趣的部分是明确的“甚至不是 PROC SORT”。

PROC MEANS 有一个有用的副作用,它按类变量(按类变量顺序)对数据进行排序。所以,

PROC SORT data=blah out=blah_w;
by x y;
run;

PROC MEANS data=blah;
class x y;
var y;
output out=blah_w n=;
run;

得到几乎相同的结果。尽管 PROC MEANS 不需要排序,但两者都生成了一个排序为 by x y 的数据集。

所以在这种情况下,您可以使用 PROC MEANS 的 class 语句来生成按重量和家庭排序的数据集(即使您不需要家庭,也必须在此处结转家庭)。然后你必须使用一个数据步骤来生成一个 RANK 变量,它是当前行的排名(使用_FREQ_ 列来计算,以防在同一个家族中有多个具有相同排名的人,并认为关于如果出现平局该怎么办),然后是另一个PROC MEANS,这次由family进行总结。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多