* Из "длинного" в "широкий" (помещение повторяющихся записей в одно наблюдение). * Например, есть повторяющиеся сведения о пациентах, записанные одни над другими. Т.е. есть * номер пациента (ключ) и номер измерения данного пациента (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'.