1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
Следующий код выполняет ранжирование значений внутри наблюдения (по строке).
Пример рассчитан на ранжирование значений 4-х переменных.

Идея решения. Сначала превращаем каждое наблюдение в 4 наблюдения, сохраняя при
этом исходный номер каждого наблюдения и позиции переменных в исходном файле. Затем 
используется процедура RANK для ранжирования значений в пределах одного и того же
ID - исходного номера наблюдения. После этого мы "сжимаем" развёрнутый и
проранжированный файл вновь в формат "один ID - одно наблюдение". При этом создавая 
4 ранговые переменные. Новый файл после этого сливается с исходным.
Может показаться, что решение использует слишком много преобразований с файлами, однако,
мне кажется, это проще, чем писать вложенные циклы, механически осуществляя ранжирование
внутри наблюдений.le.

* Источник кода неизвестен.

* если ваш файл уже отсортирован по идентификационной переменной
* (назовём её ID), пропустите команды сортировки и вычисления из этого раздела.
* Иначе, используйте команды, соответствующие состоянию вашего файла.
* если файл уже имеет идентификационную переменную, но ещё не отсортирован по ней,
* сортируем файл по этой переменной.
sort cases by id.
* если файл даже не имеет идентификационной переменной, создадим её.
compute id = $casenum.
save outfile = 'c:\\temp\\cesrates.sav'.


vector ces = cescon to cesho.
loop cesvar = 1 to 4.
compute cesrate = ces(cesvar) .
xsave outfile = 'c:\\temp\\temp1.sav' / keep = id cesvar cesrate .
end loop.
execute.

get file = 'c:\\temp\\temp1.sav'.
rank variables = cesrate (d) by id
/ ties = low / rank into cesrank .
numeric RANKCON RANKFA RANKACH RANKHO (f4.1).
vector cesr = rankcon to rankho .
compute cesr(cesvar) = cesrank.
execute.

aggregate outfile = * /presorted / break = id
/rankcon rankfa rankach rankho = max(rankcon to rankho).

MATCH FILES /FILE = 'c:\\temp\\cesrates.sav' /FILE = * /BY id .
execute.