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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
Крис,
  Есть несколько способов решить эту задачу.  Принципиально различных.
Уверен, что есть и другие способы также, но эти пришли мне на ум сейчас.
С уважением, David Marso
Консалтинговая служба SPSS
--------
**************************************************
* Метод, сравнивающий значение каждой переменной со значениями
* предыдущих переменных, уничтожающий дубликаты
* и подсчитывающий число оставшихся кодов.
**************************************************.
data list free/ id  prog1 prog2 prog3 prog4 prog5.
begin data
001    345     345     876     509     345
002     .      220     220      .      350
end data.


* Копируем массив * .
VECTOR P=PROG1 TO PROG5 / #TMP(5).
LOOP #I=1 to 5.
+  compute #TMP(#I)=P(#I).
END LOOP.

* Сравниваем с предыдущими переменными *.
LOOP #I=2 to 5.
+  LOOP #J=1 TO #I-1.
+    IF #TMP(#I)=#TMP(#J) #TMP(#I)=$SYSMIS.
+  END LOOP IF MISSING(#TMP(#I)).
END LOOP.
COMPUTE N=NVALID(#TMP1 TO #TMP5).
EXECUTE.

**************************************************
* Метод, реструктурирующий файл данных             * 
* (создаётся несколько записей на одного студента) *
* с последующим аггрегированием                    *.
**************************************************.
data list free/ id  prog1 prog2 prog3 prog4 prog5.
begin data
001    345     345     876     509     345
002     .      220     220      .      350
end data.
*сохраняем файл для последующего слияния *.
SAVE OUTFILE 'TMP'.
VECTOR PROG=PROG1 TO PROG5.
loop P=1 to 5.
compute program=PROG(P).
DO IF NOT (MISSING(PROGRAM)).
XSAVE OUTFILE 'PROG' / KEEP ID PROGRAM.
END IF.
END LOOP.
EXECUTE.
GET FILE 'PROG' .
AGGREGATE OUTFILE * / BREAK ID PROGRAM / N=N.
AGGREGATE OUTFILE * / BREAK ID / N=N.
MATCH FILES FILE 'TMP' / FILE * / BY ID.
EXECUTE.

Chris Conway пишет:
>
> Задаю вопрос по просьбе коллеги:
>
> Я работаю с файлом регистраций студентов. Запись для каждого отдельного студента
> может содержать до 5 регистраций студента в разных программах. Для каждой из 5 возможных
> регистраций заведена отдельная переменная.
>
> Таким образом, структура примерно такая:
>
> ID   prog1 prog2 prog3 prog4 prog5
>
> ID и prog1 - prog5 - числовые переменные. Имеются пропуски.
> Мне надо определить, в скольки уникальных программах был зарегистрирован каждый студент.
>
> Например, для следующих двух записей будет 3 уникальных программы 
> и 2 уникальных программы, соответственно:
>
> (id)  (prog1) (prog2) (prog3) (prog4) (prog5)
> 001    345     345     876     509     345
> 002            220     220             350
>
> Буду признателен за любую помощь.
>
> Спасибо, Chris Conway