Loops 如何将等级应用于SAS中的子组?

Loops 如何将等级应用于SAS中的子组?,loops,sas,rank,Loops,Sas,Rank,免责声明:这是家庭作业 我有一个SAS数据集: ID VAL YEAR 我需要按年份将他们分为10组 因此,在我的例子中,从1980年到2000年,每年都有许多行 如果我想对整个集合进行排名,我会这样做: proc rank groups=10 data=foo out=bar; var val; ranks s1; run; 但这并不能将他们按年份分开。所以我试着把它放入一个DO循环,然后APPEND每年的排名数据如下: do i=0 to 20; data z; set l;

免责声明:这是家庭作业

我有一个SAS数据集:

ID    VAL   YEAR
我需要按
年份将他们分为10组

因此,在我的例子中,从1980年到2000年,每年都有许多行

如果我想对整个集合进行排名,我会这样做:

proc rank groups=10 data=foo out=bar;
var val; ranks s1; run;
但这并不能将他们按年份分开。所以我试着把它放入一个
DO
循环,然后
APPEND
每年的排名数据如下:

do i=0 to 20;
data z; set l;
if year = 1980 + i;
keep id year val;
run;

proc append  base=l data=z;
run;
end;
run;
但它不将
i
识别为变量,也不附加任何数据。
有什么想法吗?

不确定这是否正是你想要的。如果您想通过变量执行
rank
,只需通过
proc rank
语句声明
by
。在执行此操作之前,还要确保数据集已按年份排序

proc rank groups=10 data=foo out=bar;
var val; 
ranks s1; 
by year;
run;

我认为这只是排名不分年份。如果我只排名一年,其结果是不同的。我刚刚验证过,你的方法不起作用。无论年份如何,它都是按val排序的。请提供一个数据示例,描述原始数据以及转换后的数据
by
语句将在每年的每个子组中进行排名。所以我真的不明白你说它忽略了“年”。如果你按年追加
,你是对的之后<代码>排名s1更新你的答案,我会标记它!谢谢。没有
按年排名不考虑<代码>年份专栏,只是按年份排列它们。既然你说这是为了家庭作业,你可能想知道为什么你的循环代码不起作用。DO/TO-END是特定于数据步骤的代码。对于您的示例,您将需要使用宏逻辑,例如%DO/%to-%END。此外,“1980+i”也需要改为“1980+i”。最后,所有这些都需要在宏定义中编写。Robbie提供的答案更有效,但很高兴看到你也在考虑其他选择。