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
* Преобразование от "широкого" к "узкому" с добавлением старых имён переменных в качестве меток значений.

* ВОПРОС: требуется преобразовать файл данных от формата с одной строкой на объект к формату нескольких строк на объект. 
* При этом хочется, чтобы прежние имена переменных в "широком" формате стали метками значений вновь созданных переменных.

ОТВЕТ. Автор: rlevesque@videotron.ca.
* Замечу, что вместо переменной case (фигурировавшей в исходном вопросе), я использую переменную casen, 
  а вместо value - value1, т.к. надёжнее (а иногда и просто необходимо) не использовать в качестве имён переменных
  зарезервированные слова SPSS.

* ###### ПРИМЕЧАНИЕ ######  
* Использованная в данном синтаксисе технология (когда синтаксис сам формирует новый файл синтаксиса)
  весьма универсальна и может быть рекомендована для многих других решений.

DATA LIST LIST /ant_s ant_r infer_s infer_r casen.
BEGIN DATA
0 0 1 0 1
1 1 0 0 2
1 0 2 2 3
END DATA.
VARIABLE LABEL 
	ant_s 'anterior_stress' 
	ant_r 'anterior_rest' 
	infer_s 'inferior_stress' 
	infer_r 'inferior_rest'.
LIST.

SAVE OUTFILE='c:\\temp\\data.sav'.
MATCH FILES FILE=* /DROP=casen.
FLIP.
STRING labelstr(A10).
COMPUTE labelstr=CONCAT("'",case_lbl,"'").
COMPUTE segment=$casenum.
FORMATS segment (F8.0).
WRITE OUTFILE 'c:\\temp\\temp.sps' /"ADD VALUE LABELS segment "segment " " labelstr ".".
EXE.

GET FILE='c:\\temp\\data.sav'.

* начало фрагмента кода, предложенного самим автором вопроса.
VECTOR yvec = ant_s TO infer_r.
LOOP segment = 1 to 4.
COMPUTE value1=yvec(segment).
XSAVE OUTFILE="c:\\temp\\mahr_vec.sav" / KEEP segment casen value1.
END LOOP.
EXECUTE.
GET FILE="c:\\temp\\mahr_vec.sav".
* конец фрагмента кода, предложенного автором вопроса.

* Следующая строка запускает рабочий синтаксис, который делает все нужные преобразования.
INCLUDE 'c:\\temp\\temp.sps'.