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