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
47
48
49
50
51
52
53
54
55
56
57
58
* Решение SPSS AnswerNet: 100006782.
* Агрегирование с медианой.
* С 14-й версии SPSS имеет функцию MEDIAN в команде AGGREGATЕ - примеч. перев.

DATA LIST FREE /id score. 
BEGIN DATA 
1 1 1 2 1 3 1 4 1 5 
2 1 2 3 2 5 2 7 2 9 
3 2 3 4 3 6 3 8 3 10 
END DATA. 
** Теперь мы агрегируем файл, группируя его по переменной id и сохраняя
число значений в каждой группе. 
AGGREGATE OUTFILE 'c:\\temp\\aggmedian.sav'/ 
PRESORTED/ BREAK=id/ nscore=N(score). 
** Теперь добавляем данные из агрегированного файла назад в исходный файл,
** вставляя по одному наблюдению в каждую группу id и помечая в 
** переменной aggfile, что агрегированное наблюдение пришло из внешнего файла.
ADD FILES FILE 'c:\\temp\\aggmedian.sav'/IN=aggfile/FILE */BY id. 
exe. 
** Теперь раcщепляем файл по переменной id так, что последующие процедуры
** будут выполняться для каждой подгруппы id. 
SPLIT FILE BY id. 
** К этому моменту мы знаем, что переменная "score" имеет пропущенное значение 
** (по крайней мере) для одного наблюдения в каждой подгруппе id; это значение у нас 
** появилось после объединения исходного и агрегированного файла. 
** Тогда мы можем использовать процедуру RMV (Replace Missing Values) для замены пропущенного значения  
** медианой по переменной "score" (внутри соответствующей группы id, поскольку 
** включено расщепление файла по id). 
RMV medscore=MEDIAN(score, ALL). 
** Нас интересуют те значения с медианой, которые помечены флагом в переменной
** "aggfile". Нам необходимо распространить медианные значения (medscore) каждой подгруппы
** на всю подгруппу. 
IF id=LAG(id) medscore=LAG(medscore). 
EXE. 
** Теперь нет нужды сохранять наблюдения, добавленные после слияния исходного
** и агрегированного файлов. Уберём их из файла. 
SELECT IF NOT(aggfile). 
EXE. 
** К этому моменту каждое наблюдение внутри каждой подгруппы id имеет 
** в переменной "medscore" медиану для своей подгруппы.
** Если вам этого достаточно, можно отбросить вспомогательные переменные "nscore" 
** и "aggfile" при следующем сохранении файла. Если вашей конечной целью 
** было получить агрегированный файл с одним наблюдением для каждой
** подгруппы id с медианным значением этой подгруппы, сейчас вы имеете всё, что нужно.
** Сразу несколько функций команды AGGREGATE могут вернуть вам медианное значение,
** поскольку внутри каждой подгруппы id медиана в переменной "medscore" фактически является
** константой. Например, возьмём функцию MAX.
AGGREGATE OUTFILE * /BREAK=id/ aggmed=MAX(medscore).

**Примеч. перев. 1: если надо было получить только медианные значения (без одновременного
агрегирования со средним, минимумом, дисперсией и др. функциями), то после замены пропущенных
значений процедурой RMV достаточно было оставить в файле только наблюдения, помеченные aggrfile.
SELECT IF aggfile.
EXE.

**Примеч. перев. 2: в 14 и более поздних версиях SPSS к исходным данным для получения агрегирования
с медианой (наряду с другими функциями) достаточно выполнить, например:.
AGGREGATE OUTFILE * /BREAK=id/ aggmed=MEDIAN(score) /aggmean=MEAN(score) / aggmax=MAX(score).