«Глобальное» автоматическое перекодирование
Задача - перекодирование блока строковых переменных с сохранением единой схемы кодирования (скажем, «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. |
Related pages
...