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