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
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
*(Вопрос) Как мне построить следующую табличку:

 	ПРОДУКТ	Оч. плохо	Плохо	Средне	Хорошо	Отлично.	Среднее	Число 	 
	A	17%	8%	33%	17%	25%	3.25	12	 
	B	17%	8%	33%	17%	25%	3.25	12	 
	C	17%	8%	33%	8%	33%	3.33	12	 
	D	42%	8%	8%	8%	33%	2.83	12	 
	E	17%	42%	8%	8%	25%	2.83	12	 
	F	17%	17%	33%	8%	25%	3.08	12	 
	G	42%	8%	17%	8%	25%	2.67	12	 
	H	17%	0%	17%	42%	25%	3.58	12	 

*(Ответ) Размещён в SPSSX-L. Автор: Raynald Levesque, 21.09.2002.
* См. также http://www.spsstools.net

* Данное решение предполагает, что имеется не более, чем 32,700 наблюдений
 (Транспонированный (flipped) файл может содержать не более, чем 32,768 переменных) (в определённой версии SPSS - А.Б.). Если это ограничение представляет собой проблему, пишите, мы придумаем как это обойти.


***********************.
* Первый метод предполагает, что мы знаем число наблюдений.
***********************.

DATA LIST LIST /ProdA ProdB ProdC ProdD ProdE ProdF ProdG ProdH.
BEGIN DATA
1 1 1 1  1 1 1 1 
2 2 2 2  3 3 3 3 
3 3 3 3  4 4 4 4 
1 1 1 1  2 2 3 3 
4 4 4 4  1 1 1 1
5 5 5 5  2 2 2 4
4 4 5 5  5 5 5 5
3 3 3 1  2 3 1 4
3 3 3 1  2 3 1 4
3 3 3 1  2 3 1 4
END DATA.

FLIP.

VECTOR v=var001 TO var010.
DO REPEAT cnt=1 TO 5 /c=c1 TO c5.
. COUNT c=var001 TO var010 (cnt).
. COMPUTE meanval=MEAN(var001 TO var010).
. COMPUTE n=NVALID(var001 TO var010).
. COMPUTE c=c/n*100.
. FORMATS c(PCT4.0).
END REPEAT PRINT.

STRING product(A14).
COMPUTE product = CONCAT("Продукт  ",SUBSTR(case_lbl,5,1)).

FORMATS n(COMMA8).
VARIABLE LABEL meanval "Среднее"
	c1 "Оч. плохо" /c2 "Плохо" /c3 "Средне" /c4 "Хорошо" /c5 "Отлично".

SUMMARIZE
  /TABLES=product c1 c2 c3 c4 c5 meanval n
  /FORMAT=VALIDLIST NOCASENUM TOTAL
  /TITLE='Нужный вид таблицы...'
  /MISSING=VARIABLE
  /CELLS=NONE.
EXECUTE.


***********************.
* Второй метод - обобщённый. Самостоятельно определяет число наблюдений и работает соответственно.
***********************.

DATA LIST LIST /ProdA ProdB ProdC ProdD ProdE ProdF ProdG ProdH.
BEGIN DATA
1 1 1 1  1 1 1 1 
2 2 2 2  3 3 3 3 
3 3 3 3  4 4 4 4 
1 1 1 1  2 2 3 3 
4 4 4 4  1 1 1 1
5 5 5 5  2 2 2 4
4 4 5 5  5 5 5 5
3 3 3 1  2 3 1 4
3 3 3 1  2 3 1 4
3 3 3 1  2 3 1 4
5 5 5 5  5 5 5 5
5 5 5 5  5 5 5 5
END DATA.

SAVE OUTFILE='c:\\temp\\original data.sav'.

* Подсчитаем число наблюдений.

COMPUTE nobreak=1.
RANK VARIABLES=proda BY nobreak  /N INTO nbcases.
DO IF $CASENUM=1.
WRITE OUTFILE='c:\\temp\\nbcases.sps' /"DEFINE !nb()"nbcases"!ENDDEFINE.".
END IF.
EXECUTE.
INCLUDE 'c:\\temp\\nbcases.sps'.

* Определим имена переменных после транспонирования матрицы данных (FLIP).
STRING v(A8).
COMPUTE v=CONCAT("v",LTRIM(STRING($CASENUM,F7))).
FLIP VARIABLES=proda TO prodh  /NEWNAME=v  .


*////////////////////.
DEFINE !doit().

!LET !vlast=!CONCAT(v,!nb)
VECTOR v=v1 TO !vlast.
DO REPEAT cnt=1 TO 5 /c=c1 TO c5.
. COUNT c=v1 TO !vlast (cnt).
. COMPUTE meanval=MEAN(v1 TO !vlast).
. COMPUTE n=NVALID(v1 TO !vlast).
. COMPUTE c=c/n*100.
. FORMATS c(PCT4.0).
END REPEAT PRINT.

STRING product(A14).
COMPUTE product = CONCAT("Продукт ",SUBSTR(case_lbl,5,1)).

FORMATS n(COMMA8).
VARIABLE LABEL meanval "Среднее"
	c1 "Оч. плохо" /c2 "Плохо" /c3 "Средне" /c4 "Хорошо" /c5 "Отлично".

SUMMARIZE
  /TABLES=product c1 c2 c3 c4 c5 meanval n
  /FORMAT=VALIDLIST NOCASENUM TOTAL
  /TITLE='Таблица нужного вида...'
  /MISSING=VARIABLE
  /CELLS=NONE.

!ENDDEFINE.
*////   /////  //////.

* Вызовем макрос .
SET MPRINT=yes.
!doit.
SET MPRINT=no.