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
* Переход от "высокого" набора данных к "широкому" - общее решение.
*(Вопрос) Данные по каждому объекту (ID) расположены в разных строках согласно времени измерения переменных VAR1-VAR3 (переменная времени - TIME):

	ID  TIME  VAR1  VAR2  VAR3
	1   1     A     D     G   
	1   2     B     E     H
	1   3     C     F     I
	[...]

*	Мне требуется записать всю информацию по каждому объекту в одну строку,
	создав отдельную копию переменных VAR1-VAR3 для каждого из моментов времени. То есть, так:

*	ID  VAR11  VAR12  VAR13  VAR21  VAR22  VAR23  VAR31  VAR32  VAR33 
	1   A      B      C      D      E      F      G      H      I
	2   ...

*	Замечу, что на самом деле имеется более 3 переменных VAR и более 3 моментов времени.
*	Любые предложения приветствуются.

* (Ответ) Размещён в новостной группе spss 10.10.2001. Автор: rlevesque@videotron.ca.
* Мой веб-сайт по SPSS ----> http://www.spsstools.net

* Обратите внимание, что именование исходных переменных как var1, var2 и var3, в общем случае, не годится, так как, например, 
  в момент времени 11 будет конфликт между именами:
	var1 в момент времени 11, что даёт переменную var111 и
	var11 в момент времени 1, что, опять же, даёт переменную var111.


DATA LIST LIST /ID(F8.0)  time1(F8.0)  var1t(A8)  var2t(A8)  var3t(A8).
BEGIN DATA
1 1 A E	I
1 2 B F J
1 3 C G K
1 4 D H L
2 1 AA EE II
2 2 BB FF JJ
2 3 CC GG KK
2 4 DD HH LL
END DATA.
LIST.

SET MPRINT=no.
*//////////////////////////////////.
DEFINE !transf(nbvars=!TOKENS(1) /nbtime=!TOKENS(1))

!DO !cnt=1 !TO !nbvars.
STRING !CONCAT('var',!cnt,'t1') TO  !CONCAT('var',!cnt,'t',!nbtime)(A8).
VECTOR !CONCAT('var',!cnt)=!CONCAT('var',!cnt,'t1') TO !CONCAT('var',!cnt,'t',!nbtime).
!DOEND
VECTOR v=var1t1 TO !CONCAT('var',!nbvars,'t',!nbtime). 

!DO !cnt=1 !TO !nbvars.
COMPUTE !CONCAT(v,'((',!cnt,'-1)*',!nbtime,'+time1)')=!CONCAT(var,!cnt,'t').
!DOEND.

AGGREGATE
  /OUTFILE=*
  /BREAK=id
!DO !cnt=1 !TO !nbvars
  /!CONCAT('var',!cnt,'t1') TO  !CONCAT('var',!cnt,'t',!nbtime)=MAX(!CONCAT('var',!cnt,'t1') TO  !CONCAT('var',!cnt,'t',!nbtime))
!DOEND.
 
EXECUTE.
!ENDDEFINE.
*//////////////////////////////////.

SET MPRINT=yes.
* Вызов макроса осуществляется с указанием числа переменных и числа моментов времени.
* Примеч.: при необходимости определение значений этих двух параметров можно также запрограммировать.
!transf nbvars=3 nbtime=4.