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
137
138
139
140
141
142
143
144
* Этот макрос КРАЙНЕ полезен (IMHO).
* Он группирует значения переменной и создаёт метки для групп.
* Например, можно создать возрастные группы 1="0-4" 2="5-9" 3="10-14" ... 19="90-95".
* http://www.spsstools.net.

SET MPRINT=no.
*///////////////////////////////////////////////////////.
DEFINE !label (vname=!TOKENS(1)
                /vcoded=!TOKENS(1)
                /begr=!TOKENS(1)
                /endr=!TOKENS(1)
	    /diff=!TOKENS(1)
                /nbbins=!TOKENS(1))
* Комментарии.
* Загрузите данные, затем вызовите макрос.
* vname 	= имя перекодируемой переменной.
* vcoded       	= имя новой переменной (которая будет содержать коды групп).
* begr 	 	= BEGinning of first Range - начало первого интервала.
* endr  	= ENDing of first Range - конец первого интервала (4 означает 4.9999999...).
* diff		= характер отображения endr (как endr + 1 - diff).
* nbbins        = число интервалов (BINS).
* Внимание! nbbins, begr и endr должны задаваться целыми числами.
* Автор: Raynald Levesque, rlevesque@videotron.ca.

SAVE OUTFILE='C:\\temp\\data temp.sav'.
NEW file.
INPUT PROGRAM.
LOOP id=1 TO !nbbins.
+COMPUTE #delta=1+ !endr - !begr.
+DO IF id=1.
++COMPUTE begv=!begr.
++COMPUTE endv=begv + #delta.
++ELSE.
++COMPUTE begv=LAG(begv) + #delta.
++COMPUTE endv=LAG(endv) + #delta.
+END IF.
+END CASE.
END LOOP.
END FILE.
END INPUT PROGRAM.

STRING vname(A8).
COMPUTE vname=!QUOTE(!EVAL(!vname)).
COMPUTE dummy=0.
MATCH FILES FILE=* /BY dummy /LAST=last.
STRING vcoded(A8).
COMPUTE vcoded=!QUOTE(!EVAL(!vcoded)).
FORMATS id begv endv (F8.0).

* Создадим файл синтаксиса, перекодирующего значения.
DO IF $CASENUM=1.
WRITE OUTFILE="c:\\temp\\recode values1.sps"/"RECODE " vname " (" begv " THRU" endv " = " id " )".
ELSE IF not last.
WRITE OUTFILE="c:\\temp\\recode values1.sps"/" (" begv " THRU " endv " = " id" )".
END IF.
DO IF last.
WRITE OUTFILE="c:\\temp\\recode values1.sps"/" (" begv " THRU HIGHEST = " id" )".
WRITE OUTFILE="c:\\temp\\recode values1.sps"/" (MISSING = 999999)".
WRITE OUTFILE="c:\\temp\\recode values1.sps"/" INTO " vcoded  ". ".
END IF.

* Создадим файл синтаксиса для задания меток значений.
COMPUTE endv=RND(endv).
STRING q1(A1) /label1(A14).
COMPUTE q1="'".
DO IF not last.
COMPUTE label1=CONCAT(LTRIM(STRING(begv,F8.0))," -",LTRIM(STRING(endv-!diff,F8.2))).
ELSE.
COMPUTE label1=CONCAT(LTRIM(STRING(begv,F8.0))," и выше").
END IF.
DO IF $CASENUM=1.
WRITE OUTFILE="c:\\temp\\recode values2.sps"
        /"ADD VALUE LABELS " vcoded " 999999 " q1 "пропущено" q1 ".".
END IF.
WRITE OUTFILE="c:\\temp\\recode values2.sps"
        /"ADD VALUE LABELS " vcoded  id " " q1 label1 q1 ".".

EXECUTE.
GET FILE='C:\\temp\\data temp.sav'.
INCLUDE "c:\\temp\\recode values1.sps".
INCLUDE "c:\\temp\\recode values2.sps".
SET TNUMBERS=LABELS /TVARS=LABELS.
VARIABLE LABEL !vcoded !QUOTE(!vname).
EXECUTE.

!ENDDEFINE.
*\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\.


DATA LIST LIST /sales.
BEGIN DATA
.
.
.00
.00
.00
.00
10.99
14.80
27.99
29.80
29.90
31.99
31.99
32.95
32.99
45.99
54.95
80.50
81.80
103.59
115.95
120.99
141.50
309.60
374.90
END DATA.
LIST.

**************************.
* Пример использования макроса.
**************************.
SET MPRINT=yes.
!label vname=sales vcoded=c_sales begr=0 endr=24 diff=.01 nbbins=10.

FREQ c_sales.

* Пример 2.
* Данные для демонстрации работы макроса. 
DATA LIST FREE /age. 
BEGIN DATA 
29.99 23 24.99 25 25.01 2 5 27 65 48.3 43 90.2 71 52 35 74 
END DATA. 
LIST /CASES FROM 1 TO 2. 
COMPUTE service=MAX(age-15+UNIFORM(10),0). 

**************************. 
* Пример использования макроса. 
**************************
!label vname=age vcoded=c_age begr=0 endr=4 diff=.01 nbbins=21. 
!label vname=service vcoded=c_serv begr=0 endr=9 diff=.01 nbbins=10. 
FREQ c_age c_serv. 
CROSSTABS /TABLES=c_age BY c_serv 
	/FORMAT= AVALUE TABLES /CELLS= COUNT .