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