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'.
|