你如何在SAS中按降序添加一个变量的多个组的行号?

How do you add a row Number in SAS by multiple groups with one variable in decending order?

我在 SAS 中发现了这段代码,它模仿 SQL 服务器中的以下 window 函数:

ROW_NUMBER() OVER (PARTITION BY Var1,var2 ORDER BY var1, var2) 

=

data want;
set have
by  var1  var2;
if first.var1 AND first.var2 then n=1;
else n+1;
run;

"She's a beaut' Clark"...但是,如何模仿这个操作:

ROW_NUMBER() OVER (PARTITION BY Var1,var2 ORDER BY var1, var2 Desc)

我确定我之前有:

PROC SORT DATA=WORK.TEST
OUT=WORK.TEST;
BY var1 DECENDING var2  ;
RUN;

data WORK.want;
set WORK.Test;
by  var1 var2;
if first.var1 AND last.var2 then n=1;
else n+1;
run;

但这不起作用。

ERROR: BY variables are not properly sorted on data set WORK.TEST.

示例数据集:

data test;   
infile datalines dlm='#';
INPUT var1 var2;
datalines;
1#5 
2#4
1#3
1#6
1#9 
2#5 
2#2 
1#7
; 
run; 

我在想我可以让一个变量暂时为负,但我不想更改数据,我正在寻找一种更优雅的解决方案。

您必须告诉数据步骤期望数据按降序排列(如果您提供的是降序排列)。

您似乎还没有完全理解 FIRST 的逻辑。最后。旗帜。如果它是 FIRST.VAR1,那么根据定义它就是 FIRST.VAR2。 VAR1 的这个值的第一个观察值也是 VAR1 的这个特定值内 VAR2 的第一个值的第一个观察值。

您要对 VAR1 和 VAR2 的每个组合中的观测值进行编号吗?

data WORK.want;
  set WORK.Test;
  BY var1 DESCENDING var2  ;
  if first.var2 then n=1;
  else n+1;
run;

或者对 VAR1 中 VAR2 的不同值进行编号?

data WORK.want;
  set WORK.Test;
  BY var1 DESCENDING var2  ;
  if first.var1 then n=0;
  if first.var2 then n+1;
run;

或者对 VAR2 和 VAR1 的不同组合进行编号?

data WORK.want;
  set WORK.Test;
  BY var1 DESCENDING var2  ;
  if first.var2 then n+1;
run;