* Удаление переменных-констант из нескольких файлов. * ВОПРОС: Даны файлы данных (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.