Задача - перекодирование блока строковых переменных с сохранением единой схемы кодирования (скажем, «a»=1, «b»=2 и т.д.) вне зависимости, встречаются ли все эти значения в каждой из переменных.

  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
* Тема: автоматическое перекодирование с единой схемой для нескольких переменных.
* Ключевые слова: автоматическое, перекодирование, общая, схема, несколько, строки, переменные.
* Опубликован: 16.06.2008.
* Автор: Raynald Levesque.
* Перевод: А. Балабанов.

*(Вопрос) Имеются данные следующего вида.
* ID STR1 STR2 STR3 STR4 STRX
1 a b c d e
2 b d e
3 c c a c b
3 e c a
2 e b a
1 a b 

 * Я желаю перекодировать все эти строковые переменные с единой схемой перекодировки.
 * Не каждая из этих переменных имеет все возможные строковые значения, но вместе они
формируют полный набор всех возможных значений, которые надо учесть при перекодировании.
 * Т.е. нужен некий единый список возможных значений для всех переменных разом
так, чтобы можно было получить результат примерно в таком виде:
ID STR1 STR2 STR3 STR4 STRX
1 1 2 3 4 5
2 2 4 5
3 3 3 1 3 2
3 5 3 1
2 5 2 1
1 1 2 
("a"=1, "b"=2, "c"=3, "d"=4, "e"=5)

*(Ответ) Автор: Raymald Levesque, 16.07.2002.

DATA LIST LIST /id (F1.0) str1 str2 str3 str4 str5 (5A1).
BEGIN DATA
1 a b c d e
2 b d e
3 c c a c b
4 e c a
5 e b a
6 a b 
END DATA.
LIST.


*////////////////.
DEFINE !apply (stem=!TOKENS(1) /nb=!TOKENS(1))
SAVE OUTFILE='c:\temp\original data.sav'.

STRING s(A1).
VECTOR s=!CONCAT(!stem,'1') TO !CONCAT(!stem,!nb).
LOOP cnt=1 TO !nb.
COMPUTE s=s(cnt).
XSAVE OUTFILE='c:\temp\data1.sav' /KEEP=id cnt s.
END LOOP.
EXECUTE.

GET FILE='c:\temp\data1.sav'.
SELECT IF RTRIM(s)<>"".
AUTORECODE s /INTO srec.
N OF CASES 1.
SAVE OUTFILE='c:\temp\label definitions.sav'.


GET FILE='c:\temp\data1.sav'.
SELECT IF RTRIM(s)<>"".
SORT CASES BY s.
AGGREGATE
  /OUTFILE=*
  /BREAK=s
  /id = N(id).
COMPUTE recnb=$CASENUM.
SAVE OUTFILE='c:\temp\data2.sav'.

GET FILE='c:\temp\data1.sav'.
SORT CASES BY s.
MATCH FILES FILE=*
	/TABLE='c:\temp\data2.sav'
	/BY=s.
SORT CASES BY id cnt.

VECTOR str(!nb F1).
COMPUTE str(cnt)=recnb.


AGGREGATE
  /OUTFILE=*
  /BREAK=id
  /!CONCAT(!stem,'1') TO !CONCAT(!stem,!nb) = 
	FIRST(!CONCAT(!stem,'1') TO !CONCAT(!stem,!nb)).


!DO !cnt=1 !TO !nb
RENAME VARIABLE (!CONCAT(!stem,!cnt)=srec).
APPLY DICTIONARY FROM='c:\temp\label definitions.sav'.
RENAME VARIABLE (srec=!CONCAT(!stem,!cnt)).
!DOEND
!ENDDEFINE.
*////////////////.

SET MPRINT=yes.
!apply stem=str nb=5.
SET MPRINT=no.

P.S. Начиная с версии SPSS 13.0 подобный же результат может быть получен использованием подкоманды GROUP в команде AUTORECODE. Значительно проще! :)

102
103
104
105
106
AUTORECODE
  VARIABLES=str1 str2 str3 str4 str5  /INTO nstr1 nstr2 nstr3 nstr4 nstr5
  /GROUP
  /BLANK=MISSING
  /PRINT.