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
* "Уплотнение" данных множественного ответа за счёт удаления "пустых" переменных.

Решение AnswerNet	100006487	

ВОПРОС: 
Имеется массив данных с большим числом пропусков. Например, есть 10 переменных множественного ответа,
которые могут быть заполнены в "шахматном порядке". При этом каждый из респондентов в общей сложности 
использовал максимум 4 из этих 10 переменных. Просто удалить последние переменные нельзя, поскольку
ответы могут содержаться, например, в первой, пятой и десятой переменных. Требуется "уплотнить" данные так,
чтобы все ответы находились в первых 4 переменных. Как это сделать?

ОТВЕТ: 
Решить эту задачу можно и без преобразования данных, но здесь показан вариант решения с преобразованием.
Сначала данные "вытягиваются" в длинный столбец за счёт того, что каждое наблюдение становится десятью наблюдениями
(по числу переменных множественного ответа). Затем удаляются пропущенные наблюдения. Затем данные возвращаются к
нормальному виду, но занимают теперь максимум 4 переменные. Попробуйте выполнить пример синтаксиса и увидите,
что именно он делает.

Решение от 29.04.1999.

* Пример данных *. 
DATA LIST /x1 TO x10 1-10. 
BEGIN DATA 
1 4 6 
3 5 2 2 
1 1 3 
2 468 
359 1 
END DATA. 
LIST. 

* Пронумеруем наблюдения *. 
COMPUTE id = $CASENUM. 

* Переструктурируем из десяти переменных в одну *. 
VECTOR x = x1 TO x10. 
LOOP rec = 1 TO 10. 
COMPUTE y = x(rec). 
XSAVE OUTFILE = 'tmp.sav' 
/KEEP id rec y. 
END LOOP. 
EXECUTE. 
GET FILE 'tmp.sav'. 
LIST. 

* Уберём пустые наблюдения и перенумеруем их по-новому в пределах каждого ID *. 
SELECT IF NOT(SYSMIS(y)). 
COMPUTE rec = 1. 
IF (id = LAG(ID)) rec = LAG(rec) + 1. 
LIST. 

* Переструктурируем из одной переменной в четыре *. 
VECTOR x(4). 
COMPUTE x(rec) = y. 
AGGREGATE OUTFILE = * 
/BREAK id 
/x1 TO x4 = MAX(x1 TO x4). 
LIST.

* ГОТОВО! *.