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
* Найти переменную с минимальным значением (для каждого наблюдения).

* Макрос сравнивает 3 или больше переменных и, для каждого наблюдения, 
  определяет имена переменных, имеющих минимальное значение (либо записывает PASS, если минимум
  определить не удалось, например, когд авсе значения пропущены - примеч. перев.).

* Автор кода: Maciek Lobinski.

data list list /a b c d.
begin data
5 7 0 .
5 9 10 6
5 7 11 6
6 7 10 8
6 7 13 4
5 7 9 6
1 13 14 1
1 10 12 5
1 7 13 1
2 2 2 7
end data.
list.


define findmin (!positional= !charend('|')
 /poziom=!tokens(1))

!let !pusta=''.
!let !ciag=''.
recode !1 (0=sysmis). /*Внимание! Если требуется, чтобы нули участвовали в поиске минимума, удалите эту строку целиком - примеч. перев.*/
string !poziom (a20).
!do !i !in (!1).
!let !ciag=!concat(!ciag,',',!i).
!doend.
compute #wyb__=min(!tail(!ciag)).
compute !poziom=' '.
!do !I !in (!1).
if (!I)=#wyb__ !poziom=concat(rtrim(!poziom),!quote(!I)).
!doend.
recode !poziom (''='PASS').
variable labels
!poziom !quote(!concat('Min of ',!1)).
freq !poziom.

!enddefine.


*example:.

set mprint=yes.
findmin a b c |poziom=newvar.
findmin a c d |poziom=newvar2.
set mprint=no.

******************************.
* Результат первого вызова макроса:

Min of a b c
 	 	Frequency	Percent	Valid Percent	Cumulative Percent	 
Valid	a	9	90.0	90.0	90.0	 
 	abc	1	10.0	10.0	100.0	 
 	Total	10	100.0	100.0	 	 


* Результат второго вызова макроса:
Min of a c d
 	 	Frequency	Percent	Valid Percent	Cumulative Percent	 
Valid	a	6	60.0	60.0	60.0	 
 	ac	1	10.0	10.0	70.0	 
 	ad	2	20.0	20.0	90.0	 
 	d	1	10.0	10.0	100.0	 
 	Total	10	100.0	100.0