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
************************************************.
* Синтаксис замены пропущенных значений
 медианой из непропущенных значений в строке.
* Автор: Raynald Levesque.
************************************************.

* Синтаксис может выдавать предупрежения в том случае, если в наблюдении
нет пропусков, а, значит, процедура RMV не может сработать.
Разумеется, на такие предупреждения внимания не обращаем.

SET MPRINT=on.

* Создадим пример данных.
NEW file.
INPUT PROGRAM.
SET SEED=98675423.
VECTOR q(8F8.2).
LOOP id=1 TO 25.
	LEAVE id.
	LOOP #cnt=1 TO 8. 	
*		допустим, около 10% ответов должны иметь пропуски. 		
		IF UNIFORM(1)<.9 q(#cnt)=1+TRUNC(UNIFORM(9)).
	END LOOP.
	END CASE.
END LOOP.
END FILE.
END INPUT PROGRAM.
EXECUTE.
LIST.

*Положим, не ограничивая общности, что все переменные имеют числовой формат.
*Если это не так: 
*	сохраните нужные числовые переменные в файл NC вместе с идентификатором (id в данном случае).
*	удалите эти колонки из главного файла и сохраните его с именем FILEB, например.
*	выполните следующий код на файле NC.
*	слейте результат с файлом FILEB. 

*Создадим имена переменных для использования после команды FLIP.
STRING nnames(A8).
COMPUTE cn=$casenum.
COMPUTE nnames=CONCAT('v',LTRIM(STRING(cn,F6.0))).
EXECUTE.

* Определим макрос, который заменит пропущенные значения.

*/////////////////////////////////////////////////////.
DEFINE !doit (nbvar=!TOKENS(1)).
FLIP /NEWNAMES=nnames.
VECTOR !CONCAT('r(',!nbvar,'F8)').

SUMMARIZE
  /TABLES=v1 TO !CONCAT(v,!nbvar)
  /FORMAT=NOLIST TOTAL
  /TITLE='Выведем медианы для контроля'
  /MISSING=VARIABLE
  /CELLS=MEDIAN .

!DO !cnt=1 !TO !nbvar 
RMV !CONCAT(r,!cnt) = MEDIAN(!CONCAT(v,!cnt,',ALL)').
!DOEND

MATCH FILES FILE=* /KEEP=case_lbl r1 TO  !CONCAT(r,!nbvar).
FLIP.
*### В следующей строке "8" - это число переменных в исходном файле.
MATCH FILES FILE=* /KEEP=q1 TO  q8 id.
!ENDDEFINE.
*/////////////////////////////////////////////////////.

*### В следующей строке "25" - это число наблюдений в исходном файле данных.
!doit nbvar=25.
LIST.