Транспонирование данных со строковыми значениями
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 | * Транспонирование данных со строковыми значениями. * (стандартная процедура FLIP "теряет" строковые значения - примеч. перев.). * Автор: Gail Lucas; размещено в SPSSX-L 04.10.2000. DATA LIST / STRING1 TO STRING4 (4(X,A14)). BEGIN DATA * Case1 Var1 * * Case1 Var2 * * Case1 Var3 * * Case1 Var4 * * Case2 Var1 * * Case2 Var2 * * Case2 Var3 * * Case2 Var4 * * Case3 Var1 * * Case3 Var2 * * Case3 Var3 * * Case3 Var4 * * Case4 Var1 * * Case4 Var2 * * Case4 Var3 * * Case4 Var4 * * Case5 Var1 * * Case5 Var2 * * Case5 Var3 * * Case5 Var4 * END DATA . * 1. Сохраняем данные во внешний файл, снабжая каждое значение индексами строк и столбцов *. STRING hold(A14). COMPUTE id=$CASENUM. VECTOR tmp=string1 TO string4. LOOP i=1 TO 4. COMPUTE hold=tmp(i). XSAVE OUTFILE 'tmp.sav' / KEEP id i hold. END LOOP. EXECUTE. * 2. Переупорядочиваем индексы строк и столбцов (транспонируем) *. GET FILE 'tmp.sav'. VECTOR trps(5,A14). COMPUTE trps(id) = hold. AGGREGATE OUTFILE * / BREAK i / trps1 TO trps5=MAX(trps1 TO trps5). LIST. FORMATS i (F1). LIST. *----- МАКРОС ДЛЯ РЕШЕНИЯ ЗАДАЧИ ТРАНСПОНИРОВАНИЯ СТРОКОВЫХ ДАННЫХ В ОБЩЕМ ВИДЕ ----- . DEFINE trpstrs ( vars !ENCLOSE ('(',')') / qvar !TOKENS(1) / maxw !TOKENS(1) / newn !TOKENS(1) !DEFAULT ('Case_') / nrow !TOKENS(1) ) . STRING hold(!CONCAT('a',!maxw) ). COMPUTE @id@=$CASENUM. VECTOR tmp=!vars . LOOP i=1 TO !qvar . + COMPUTE hold=tmp(i). + XSAVE OUTFILE '@trp_tmp@.sav' / KEEP @id@ i hold. END LOOP. EXECUTE. GET FILE '@trp_tmp@.sav' . VECTOR !newn(!nrow,!CONCAT('a',!maxw) ). COMPUTE !newn(@id@) = hold. AGGREGATE OUTFILE * / BREAK i / !CONCAT(!newn,'1 TO ',!newn,!nrow)=MAX(!CONCAT(!newn,'1 TO ',!newn,!nrow)). FORMATS i (F1). ERASE FILE '@trp_tmp@.sav' . !ENDDEFINE . DATA LIST / STRING1 TO STRING4 (4(X,A14)). BEGIN DATA * Case1 Var1 * * Case1 Var2 * * Case1 Var3 * * Case1 Var4 * * Case2 Var1 * * Case2 Var2 * * Case2 Var3 * * Case2 Var4 * * Case3 Var1 * * Case3 Var2 * * Case3 Var3 * * Case3 Var4 * * Case4 Var1 * * Case4 Var2 * * Case4 Var3 * * Case4 Var4 * * Case5 Var1 * * Case5 Var2 * * Case5 Var3 * * Case5 Var4 * END DATA . set mprint=yes. trpstrs vars=(string1 to string4) qvar=4 maxw=15 newn=string nrow=5. |