Из «длинного» в «широкий» (помещение повторяющихся записей в одно наблюдение)
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 145 | * Из "длинного" в "широкий" (помещение повторяющихся записей в одно наблюдение). * Например, есть повторяющиеся сведения о пациентах, записанные одни над другими. Т.е. есть * номер пациента (ключ) и номер измерения данного пациента (1, 2 и т.д.). Остальные переменные * содержат результаты измерения. Требуется создать дубликаты таких переменных, чтобы данные * всех измерений одного и того же пациента содержались в одной и той же строке. - примеч. перев. run name из "длинного" вида - в "широкий". * (команда run name использовалась в ранних версиях SPSS. * По крайней мере, с версии SPSS 10, а, возможно, и ранее, ей на смену пришла команда TITLE) - примеч. перев. * Программа преобразует файл с повторяющимися записями для одного и того же * объекта в "широкий" формат (повторные записи располагаются в той же строке, * но в других (новых) переменных. * Имена переменных и форматы сохраняются . * Если среди новых имён переменных появляются дубликаты, программа исправит это. * Программа тестировалась на spss6.1 для unix и на spss9 для windows. * Эта версия - для Windows. Необходимо быть аккуратным при изменении. * путей к файлам. * Программа использует пример файла данных для преобразования: sleep-dis2.sav, * ссылку на него можно найти на www.spsstools.ru - примеч. перев. * Дайте знать, если у вас есть какие-то замечания: hilel@bgumail.bg.ac.il. * . PRESERVE. set width=130 mxwars=2000 length=120 printback=listing . set mprint=yes . define ltow ( outfile !tokens (1) / infile !tokens (1) / repeat !tokens (1) / path !tokens (1) / sortvar !enclose ('(',')') / dropvar !enclose ('{','}') / timestr !enclose ('[',']') ) . * в файле необходима переменная с последовательной нумерацией записей, относящихся к одному и тому же объекту. * ключевая переменная (переменная с порядком сортировки) не должна дублироваться, её временно исключаем из файла. get file= !infile /drop = !dropvar . n of cases 1 . execute . flip . rename var case_lbl = varname . compute varnum =$casenum . list . sort cases by varname . !let !filenm =!quote(!concat(!unquote(!path),'tmp.sv')) . aggregate outfile=!filenm /break = varname / nvar=n(varname) . execute . match files file= * / table=!filenm / by varname / first=start. string newvar(a7) . numeric seqnum(f1) . leave seqnum . if start eq 1 seqnum=0 . compute seqnum=sum(seqnum,1) . compute newvar=varname . do if nvar gt 1 . compute substr(newvar,7,1)=string(seqnum,f1) . end if . sort cases by varnum . !let !filenm =!quote(!concat(!unquote(!path),'dic.sv')) . save outfile=!filenm / drop var001 / map . execute . list . get file= !filenm / map . string newname(a8) groupstr(a1) . !do !aa !in ( !timestr ) . compute groupstr=!quote(!aa) . compute newname = concat(rtrim(newvar,' '),!quote(!aa)) . !let !filenm =!quote(!concat(!unquote(!path),'dic.new')) . print outfile=!filenm / varnum, groupstr, newvar , newname (f4 a1 a7 a8). !doend . execute . data list file=!filenm records=1 / varnum, groupstr, newvar , newname(1x f4 a1 a7 a8) . compute dummi = 1 . sort cases by dummi . add files file=* / by dummi / last=lastone . sort cases by groupstr varnum . numeric groupnum(f2) . leave groupnum . if varnum eq 1 groupnum=sum(groupnum,1) . add files file=* / by groupstr / last=fin . list . !let !filenm =!quote(!concat(!unquote(!path),'dic.sps')) . do if varnum eq 1 . print outfile=!filenm / "get file= ",!quote(!infile) / "select if " , !quote(!repeat) , " = " , groupnum / "rename var " . end if . print outfile=!filenm / " (" , newvar , " = " newname ,")" . do if fin eq 1 . string filename(a40) . compute filename =concat(!path, !quote(!outfile),groupstr,'.sav' ) . print outfile=!filenm / "xsave outfile= " , "'", filename ,"'" / "execute " . end if . compute case1=$casenum . do if lastone eq 1 . print outfile=!filenm / "match file" . !do !aa !in ( !timestr ) . compute filename =!quote(!concat(!unquote(!path),!unquote(!outfile), !unquote(!aa),'.sav')) . print outfile=!filenm / " file = " , "'", filename , "'" , " / " . !doend . compute filename =!quote(!concat(!unquote(!path),!unquote(!outfile), '.sav' )) . compute filename=rtrim(filename) . print outfile=!filenm / " by " ,!quote(!sortvar) , "/ map " / "execute "/ "save outfile= " ,"'", filename ,"'" / "execute " . end if . execute . data list file=!filenm records=1 / line ( 1x a100) . execute . list . write outfile=!filenm / line (a100) . execute . set mprint=off . include !filenm . !enddefine . RESTORE. * Справка по параметрам вызова макроса. * sortvar переменная с номером объекта в исходном файле. * repeat последовательные номера записей, относящихся к одному и тому же объекту. * infile исходное имя файла данных. * outfile имя файла, который создаст программа. * dropvar переменная-ключ, которую не следует дублировать. * timestr суффиксы для индексирования имён создаваемых переменных к каждой повторной записи. * Вызов макроса. ltow outfile = newfile repeat = repeat sortvar = ( sno ) dropvar = { sno } timestr = [ a b ] infile = 'c:/temp/sleep-dis2.sav' path = 'c:/temp/sleep-dis3.sav'. |