* Тема: Формирование перечня/сводки пропущенных значений с идентификаторами наблюдений. * Ключевые слова: пропущенные значения, перечни переменных, макрос, макроаргументы, слияние файлов. * Опубликован: 09.03.2008. * Автор: rlevesque@videotron.ca. * Перевод: А. Балабанов. * Размещение: http://www.spsstools.ru/Syntax/WorkWithMissing/ListVariableNameWithMissingValuesAsWellAsIdentifyingElementsOfCase.txt(.sps). *(Вопрос) Имеется массив данных, где в некоторых переменных встречаются пропущенные значения. Я хотел бы создать сводную таблицу (файл данных), где в переменной VNAME было бы указано имя переменной, где встретился очередной пропуск, а также информация о наблюдении, в котором пропуск встретился. Например, идентификатор организации (OID), номер медицинской страховки(MEDRECNM) и инициалы (REVIEWER). *(Ответ) Размещен в SPSSX-L 23.08.2001. Автор: rlevesque@videotron.ca. В решении предполагается, что пустые строки (пробелы) означают пропущенные значения. * Т.к. пример данных отсутствует, решение проверяется с другими переменными на файлах данных, поставляемых с SPSS: World95.sav и Employee data.sav. См. примеры ниже. * Чтобы решение было универсальным, оно оформлено в виде 2 макросов. * Комментарии к первому макросу: Некоторые команды не позволяют указывать перечни переменных в формате "var1 TO xyz5". Данный макрос формирует перечень всех переменных между двумя указанными. Если переменные не указаны, макрос возвращает перечень всех переменных в файле. Особенно этот макрос полезен в случае, если в файле данных имеются сотни переменных. В некоторых случаях для корректной работы макросов имена переменных требуется передавать с кавычками. Поэтому кроме макроса !list1 макрос, приведенный ниже, формирует еще и макрос !qlist1. *///////////////////////////////////////. DEFINE !DefList (var1=!DEFAULT(ALL) !TOKENS(1) /var2=!TOKENS(1) /fname=!CMDEND) GET FILE=!fname. N OF CASES 1. !IF (!var1 !NE ALL) !THEN ADD FILES FILE=* /KEEP=!var1 TO !var2. !IFEND FLIP. COMPUTE dummy=1. MATCH FILES FILE=* /BY=dummy /FIRST=first /LAST=last. DO IF first. + WRITE OUTFILE='c:\\temp\\list1.sps' / 'DEFINE !list1()' case_lbl. + WRITE OUTFILE='c:\\temp\\qlist1.sps' / 'DEFINE !qlist1()"' case_lbl'"'. ELSE if not last. + WRITE OUTFILE='c:\\temp\\list1.sps' / " "case_lbl. + WRITE OUTFILE='c:\\temp\\qlist1.sps' / " '"case_lbl"'". ELSE. + WRITE OUTFILE='c:\\temp\\list1.sps' /" "case_lbl ' !ENDDEFINE'. + WRITE OUTFILE='c:\\temp\\qlist1.sps' /" '"case_lbl"'" ' !ENDDEFINE'. END IF. EXECUTE. GET FILE=!fname. INCLUDE FILE='c:\\temp\\list1.sps'. * На всякий случай: qlist1 - тот же список list1, но с именами переменных в кавычках. INCLUDE FILE='c:\\temp\\qlist1.sps'. !ENDDEFINE. *///////////////////////////////////////. /* Это второй макрос. Он использует макрос !list1, который, в свою очередь, был создан первым макросом */. */////////////////////////////. DEFINE !getmiss (fname=!CHAREND('/') /show=!CMDEND) !LET !first=1 !DO !var !IN (!EVAL(!list1)) + GET FILE=!fname. + STRING vname(A8). * Одна из следующих 2 строк всегда будет давать ошибку. Это нормально. Можно просто проигнорировать. + SELECT IF SYSMIS(!var). + SELECT IF LEN(RTRIM(!var))=0. + COMPUTE vname = !QUOTE(!var). + SAVE OUTFILE="c:\\temp\\tempmissing.sav" /KEEP=vname !show. !IF (!first=0) !THEN + GET FILE="c:\\temp\\missing.sav". + CACHE. + EXECUTE. + ADD FILES /FILE=* /FILE="c:\\temp\\tempmissing.sav". !IFEND + SAVE OUTFILE="c:\\temp\\missing.sav" /KEEP=vname !show. !LET !first=0 !DOEND !ENDDEFINE. */////////////////////////////. *********************. ****** Пример 1. *********************. * Следующий вызов макроса создаёт макрос с перечнем всех переменных в указанном файле данных. !DEfList fname="c:\\Program Files\\SPSS\\World95.sav". * Следующий вызов макроса создает требуемый файл данных, в котором для идентификации наблюдений (стран мира) используется, собственно, название страны (country), а также переменные populatn и region. !getmiss fname="c:\\Program Files\\SPSS\\World95.sav" /show=country populatn region. * (в этом примере имеется 104 пропущенных значения). *********************. ****** Пример 2. *********************. * Следующий вызов макроса создаёт макрос с перечнем всех переменных в указанном файле данных. !DEfList fname="c:\\Program Files\\SPSS\\Employee data.sav". * Следующий вызов макроса создает требуемый файл данных, в котором для идентификации наблюдений используются переменные id и jobcat. !getmiss fname="c:\\Program Files\\SPSS\\Employee data.sav" /show=id jobcat. * (в этом примере пропущенное значение встречается только один раз).