Следующий код выполняет ранжирование значений внутри наблюдения (по строке).
Пример рассчитан на ранжирование значений 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.