Как добавить номер строки в SAS несколькими группами с одной переменной в порядке убывания? - PullRequest
0 голосов
/ 28 апреля 2020

Я обнаружил этот код в SAS, который имитирует следующую оконную функцию на SQL сервере:

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;

"Она красавица, Кларк" .. но, как один mimi c эта операция:

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;

Но это не работает.

ОШИБКА: переменные BY неправильно отсортированы в наборе данных 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; 

Я думал, что могу сделать одну переменную временной отрицательной, но я не хочу менять данные, я ищу более элегантное решение.

1 Ответ

0 голосов
/ 28 апреля 2020

Вы должны указать шагу данных ожидать данные в порядке убывания, если это то, что вы даете им.

Вы также, похоже, не совсем понимаете логику c ПЕРВОГО. и ПОСЛЕДНЕЕ. флаги. Если это FIRST.VAR1, то по определению это FIRST.VAR2. Первое наблюдение для этого значения VAR1 также является первым наблюдением для первого значения VAR2 в пределах этого указанного c значения VAR1.

Хотите ли вы пронумеровать наблюдения в каждой комбинации VAR1 и VAR2?

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

Или пронумеровать различные значения VAR2 в VAR1?

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;
...