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
* Транспонирование данных со строковыми значениями.
* (стандартная процедура FLIP "теряет" строковые значения - примеч. перев.).

* Автор: Gail Lucas; размещено в SPSSX-L 04.10.2000.

DATA LIST / STRING1 TO STRING4 (4(X,A14)).
BEGIN DATA
* Case1 Var1 * * Case1 Var2 * * Case1 Var3 * * Case1 Var4 *
* Case2 Var1 * * Case2 Var2 * * Case2 Var3 * * Case2 Var4 *
* Case3 Var1 * * Case3 Var2 * * Case3 Var3 * * Case3 Var4 *
* Case4 Var1 * * Case4 Var2 * * Case4 Var3 * * Case4 Var4 *
* Case5 Var1 * * Case5 Var2 * * Case5 Var3 * * Case5 Var4 *
END DATA .

* 1. Сохраняем данные во внешний файл, снабжая каждое значение индексами строк и столбцов *.
STRING hold(A14).
COMPUTE id=$CASENUM.
VECTOR tmp=string1 TO string4.
LOOP i=1 TO 4.
COMPUTE hold=tmp(i).
XSAVE OUTFILE 'tmp.sav' / KEEP id i hold.
END LOOP.
EXECUTE.

* 2. Переупорядочиваем индексы строк и столбцов (транспонируем) *.
GET FILE 'tmp.sav'.
VECTOR trps(5,A14).
COMPUTE trps(id) = hold.
AGGREGATE OUTFILE *
	/ BREAK i / trps1 TO trps5=MAX(trps1 TO trps5).
LIST.
FORMATS i (F1).
LIST.


*----- МАКРОС ДЛЯ РЕШЕНИЯ ЗАДАЧИ ТРАНСПОНИРОВАНИЯ СТРОКОВЫХ ДАННЫХ В ОБЩЕМ ВИДЕ ----- .
DEFINE trpstrs ( vars !ENCLOSE ('(',')')
	/ qvar !TOKENS(1)
	/ maxw !TOKENS(1)
	/ newn !TOKENS(1) !DEFAULT ('Case_')
	/ nrow !TOKENS(1) ) .

STRING hold(!CONCAT('a',!maxw) ).
COMPUTE @id@=$CASENUM.
VECTOR tmp=!vars .
LOOP i=1 TO !qvar .
+ COMPUTE hold=tmp(i).
+ XSAVE OUTFILE '@trp_tmp@.sav' / KEEP @id@ i hold.
END LOOP.
EXECUTE.

GET FILE '@trp_tmp@.sav' .
VECTOR !newn(!nrow,!CONCAT('a',!maxw) ).
COMPUTE !newn(@id@) = hold.
AGGREGATE OUTFILE *
	/ BREAK i
	/ !CONCAT(!newn,'1 TO ',!newn,!nrow)=MAX(!CONCAT(!newn,'1 TO ',!newn,!nrow)).
FORMATS i (F1).
ERASE FILE '@trp_tmp@.sav' .
!ENDDEFINE .



DATA LIST / STRING1 TO STRING4 (4(X,A14)).
BEGIN DATA
* Case1 Var1 * * Case1 Var2 * * Case1 Var3 * * Case1 Var4 *
* Case2 Var1 * * Case2 Var2 * * Case2 Var3 * * Case2 Var4 *
* Case3 Var1 * * Case3 Var2 * * Case3 Var3 * * Case3 Var4 *
* Case4 Var1 * * Case4 Var2 * * Case4 Var3 * * Case4 Var4 *
* Case5 Var1 * * Case5 Var2 * * Case5 Var3 * * Case5 Var4 *
END DATA .

set mprint=yes.
trpstrs vars=(string1 to string4) qvar=4 maxw=15 newn=string nrow=5.