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
* Удаление переменных-констант из нескольких файлов.

* ВОПРОС: Даны файлы данных (year1972, year1973, year1974), где встречаются неиспользуемые переменные.
  Как можно удалить неиспользуемые переменные? Переменная считается неиспользуемой, если содержит
  одинаковые значения для всех наблюдений (является константой).

* РЕШЕНИЕ.
* (проверено на версии 10.07).
* Автор: Raynald Levesque, 23.09.2000.

* Предположения: 	число переменных одинаково во всех файлах; все переменные числовые.
* Примечание: да, синтаксис нельзя назвать универсальным:
*   1. Потребуется изменить все пути, затем...
*   2. Указать число переменных в файле (см. *### (Замечание 2) ниже).
*   3. Указать имена первой и последней переменной в файле (см. *### (Замечание 3) ниже).


*****************************************.
* Создадим для примера 3 файла данных.
*****************************************.
* Первый файл данных содержит пропущенное значение (для переменной d) чтобы показать,
  что эта переменная также будет удалена.
* Пропущенное значение спровоцирует предупреждающее сообщение программы, которое можно проигнорировать.
DATASET CLOSE All.

DATA LIST LIST /a b c d z.
BEGIN DATA
1 2 2 -1 2
1 1 2 . 1
1 2 2 -1 3
1 1 2 -1 5
END DATA.
LIST.
* здесь нужно будет оставить только переменные b и z.
SAVE OUTFILE='c:\\temp\\year1972.sav'.

DATA LIST LIST /a b c d z.
BEGIN DATA
2 2 2 4 2
2 1 2 5 2
2 2 2 -1 2
2 1 2 -1 2
END DATA.
LIST.
* здесь нужно будет оставить только переменные b и d.
SAVE OUTFILE='c:\\temp\\year1973.sav'.

DATA LIST LIST /a b c d z.
BEGIN DATA
3 2 2 4 5
3 2 2 4 2
3 2 2 -1 2
3 2 2 -1 2
END DATA.
LIST.
* здесь нужно будет оставить только переменные d и z.
SAVE OUTFILE='c:\\temp\\year1974.sav'.

*****************************************.
* Конец подготовительного этапа.
*****************************************.

SET MPRINT=yes.

* Определим макрос, который будет обрабатывать один файл (с данными за очередной год) за один запуск.

*////////////////////////////////////////////////.
DEFINE !delete(year=!TOKENS(1)).

GET FILE=!QUOTE(!CONCAT('c:\\temp\\year',!year,'.sav.')).

* Сохраним имена переменных в отдельный файл.
N OF CASES 1.
FLIP.
COMPUTE varnum=$casenum.
SAVE OUTFILE=!QUOTE(!CONCAT('c:\\temp\\vn',!year,'.sav.')).
CACHE.
EXE.

GET FILE=!QUOTE(!CONCAT('c:\\temp\\year',!year,'.sav.')).

*### (Замечание 2) Замените 5 на число переменных в вашем файле. 
*### (Замечание 3) Замените a и z на имена первой и последней переменных в вашем файле.
RENAME VARIABLE (a TO z = var1 TO var5).
COMPUTE dum=1.

* Если стандартное отклонение переменной равно нулю, это означает, что все её значения одинаковы.
* Поскольку переменные переименованы с порядковыми номерами, нет нужды в команде AGGREGATE перечислять их все.

*### (Замечание 2) Замените 5 на число переменных в вашем файле.
AGGREGATE
  /OUTFILE=*
  /BREAK=dum
  /var1 TO var5 = SD(var1 TO var5).
FLIP.

* Уберём вспомогательное наблюдение.
SELECT IF Lower(SUBSTR(case_lbl,1,3))<>"dum".

*Восстановим исходные имена переменных.
MATCH FILES FILE=* /DROP=case_lbl.
COMPUTE varnum=$casenum.
EXECUTE.


* Сохраним имена неиспользованных переменных.
SELECT IF var001=0.


MATCH FILES /FILE=*
 /TABLE=!QUOTE(!CONCAT('c:\\temp\\vn',!year,'.sav.'))
 /RENAME (var001 = d0)
 /BY varnum
 /DROP= d0.



*Запишем файл синтаксиса, который удалит эти переменные.
WRITE OUTFILE='c:\\temp\\delete vars.sps' /"MATCH FILES FILE=* /DROP=" case_lbl ".".
EXE.

* Применим созданный синтаксис к исходному файлу.
GET FILE=!QUOTE(!CONCAT('c:\\temp\\year',!year,'.sav.')).
INCLUDE 'c:\\temp\\delete vars.sps'.
SAVE OUTFILE=!QUOTE(!CONCAT('c:\\temp\\y',!year,'.sav.')).
!ENDDEFINE.
*////////////////////////////////////////////////.


*### (Замечание 4). В следующем макросе замените 1974 на последний год, за который есть данные.

*////////////////////////////////////////////////.
DEFINE !main().
!DO !y=1972 !TO 1974.
!delete year=!y.
!DOEND.
!ENDDEFINE.
*////////////////////////////////////////////////.

* Вызовем главный макрос для выполнения всех преобразований.
!main.