Разложить значения, разделённые запятыми, по разным переменным и закодировать результат
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 | * Требуется разбросать значения из текстовой переменной, разделённой запятыми, * по разным переменным, а затем закодировать значения. DATA LIST FIXED /caseid 1-2 (F) a 3-255 (A). BEGIN DATA 01spain, russia, canada, soviet union 02Spain,USA, France,CANADA 03 04UK,Germany,Russia, Mexico,France,canada END DATA. * NB! Возникнут проблемы, если название страны имеет более 17 символов, или присутствует * более 15 стран. Потребуется корректировка синтаксиса. set mprint=no. STRING #delim(A1) #tmp(A255) c1 TO c15 (A17). VECTOR c=c1 TO c15. COMPUTE #delim=",". COMPUTE #tmp=CONCAT(RTRIM(a),#delim). COMPUTE cnt=1. LOOP IF INDEX(#tmp,#delim)>1. COMPUTE c(cnt)=LOWER(LTRIM(SUBSTR(#tmp,1,INDEX(#tmp,#delim)-1))). COMPUTE cnt=cnt + 1. COMPUTE #tmp=SUBSTR(#tmp,INDEX(#tmp,#delim)+1). END LOOP. *////////////////. DEFINE !apply (id=!TOKENS(1) /stem=!TOKENS(1) /nb=!TOKENS(1) /fmt=!TOKENS(1)) SAVE OUTFILE='c:\\temp\\original data.sav'. STRING s(!fmt). VECTOR sv=!CONCAT(!stem,'1') TO !CONCAT(!stem,!nb). LOOP cnt=1 TO !nb. COMPUTE s=sv(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 !stem (!nb F1). COMPUTE !stem(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. * в вызове макроса мы указываем на необходимость единообразной перекодировки переменных c1-c15 из единого текстового формата a15 в числовой с метками значений. Идентификатор наблюдения - переменная caseid. !apply id=caseid stem=c nb=15 fmt=a15. SET MPRINT=no. |