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
* Объединение нескольких наблюдений в одно, пример 1.
* Автор: rlevesque@videotron.ca.

* Пусть имеется массив данных, подобный этому:.

DATA LIST LIST /id(A2) var1(F8) var2(F8) var3(F8).
BEGIN DATA.
aa 1 1 9 
bb 2 2 4 
aa 3 6 9 
aa 4 7 8 
aa 4 7 2 
bb 4 8 3
END DATA.
LIST.

* Задача - добавить новые переменные (var4 и т.д.) и перенести в них значения из повторяющихся наблюдений
 с одним и тем же идентификатором id.
* При этом возможно ограничение числа объединяемых наблюдений с одним идентификатором (наблюдение сверх этого
 числа отбрасываются).
* Решение предполагает, что все содержательные переменные являются числовыми, так что
  если есть строки, сделайте автоперекодирование (меню Transform - Automatic Recode).


SORT CASES BY id.

* Пронумеруем наблюдения в пределах каждого ID.
DO IF $casenum=1.
COMPUTE recno=1.
ELSE.
COMPUTE recno=(lag(id)=id)*lag(recno)+1.
END IF.

* Предположим следует объединять не более 3-х наблюдений с одинаковым ID.
SELECT IF (recno<4).

* В оставшейся части синтаксиса подправьте названия и количество переменных, которые имеются в вашем файле, а также
  замените 9 на произведение числа ваших переменных на 3.
VECTOR v(9F8.0) /data1=var1 TO var3.
LOOP #cnt=1 TO 3.
COMPUTE v((recno-1)*3+#cnt)=data1(#cnt).
END LOOP.

AGGREGATE
  /OUTFILE=*
  /BREAK=id
  /v1 TO v9 = SUM(v1 TO v9).