Советую заглянуть в каждый из примеров. Все они по-своему интересны.
В каждом на определённом этапе возникает потребность сопоставить значения между
разными наблюдениями. В первом
и втором
примерах это решается путём временного "поворота" (транспонирования)
файла данных командой FLIP с последующим его разворотом этой же командой. В
результате, после разворота, наблюдения становятся переменными, и их сравнение
можно осуществлять стандартными средствами сравнения переменных в пределах одного
наблюдения. Третий
пример идёт дальше и задействует возможности матричного языка SPSS MATRIX.
Первый
пример, кроме прочего, в очередной раз заставляет нас обратить внимание на особенности
использования команды EXECUTE и системной переменной $casenum при условном
отборе наблюдений (SELECT IF):
COMPUTE counter=$casenum.
EXECUTE.
SELECT IF (counter=1 or counter ge 27).
EXECUTE.
Сначала мы вычисляем вспомогательную переменную counter
как текущий номер наблюдения, выполняем отложенные вычисления и, только потом,
пользуясь вновь созданной переменной, отбираем строки с нужными номерами. Пользоваться
переменной $casenum в команде SELECT IF в данном случае было бы не
правильно: начиная со второго наблюдения, ни одно не удовлетворяло бы условию
отбора, удалялось бы, а на его место помещалось бы следующее наблюдение, также
не удовлетворяющее условию. В результате в файле осталось бы лишь одно (первое)
наблюдение. Отсутствие EXECUTE между инструкциями COMPUTE и SELECT IF привело
бы к таким же результатам, поскольку обе инструкции выполнялись бы последовательно
внутри каждого наблюдения. В этом случае, начиная со второго наблюдения, значение
$casenum (а значит - и переменной counter) также не превзошла
бы 2.
Кстати, "ge" - одно из ключевых слов SPSS, означающее
"greater than or equal to..." (больше или равно). Так же как и слово
"or", это одно из обозначений операторов. Вместо "ge" можно
использовать ">=", а вместо "or" - вертикальную черту
"|". Такие же (или подобные) синонимы имеют и другие операторы в SPSS
и многих других языках: "and"(&), "not"(~), "gt"
(>), "lt"(<), "eq"(=), "le" (<=), "ne"(~=,
<>).
Во втором примере вы найдёте операции обработки и форматирования
переменных дат и времени, создание вспомогательных макросов "на лету",
и вообще - нетривиальный алгоритм.
В третьем
примере - "инженерный" подход к поиску максимальных значений. Очередной
найденный максимум заменяется "достаточно малым" значением (автор
синтаксиса не без оснований посчитал, что -1*10100 будет достаточно),
после чего поиск следующего максимума продолжается в том же массиве. При желании
- поэкспериментируйте с этим файлом. Установка параметру mxloop слишком малого
значения, либо попытка найти 5 наибольших значений среди меньшего числа переменных
будет давать предсказуемые результаты в итоговом файле.