Допустим необходимо большому количеству переменных присвоить значения категорий. К примеру есть переменная содержащая значения 1 и 0, где 1 – да, 0 – нет.
Если таких переменных очень много и у каждой свои метки, то присвоение таких меток может занять очень длительное время, но не в том случае если информация о метках уже содержится в какой-либо таблице, к примеру:
Переменная | Значение | Метка |
Пол | 0 | муж |
Пол | 1 | жен |
Курение | 0 | не курит |
Курение | 1 | курит |
Здесь видно, что у каждой переменной есть ряд значений, которым соответствуют метки. Их и надо нам расставить.
Доработаем код из примера “Работа с данными в IBM SPSS: присвоение меток переменным из другого источника“, добавим третий датасет с таблицей меток и выполним присвоение где это требуется.
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 | GET FILE='...'. DATASET NAME DATA1. GET FILE='...'. DATASET NAME DATA2. GET FILE='...'. DATASET NAME DATA3. DATASET ACTIVATE DATA1. begin program python. import spss varlist=[] varcnt = spss.GetVariableCount() for i in range(varcnt): varlist.append(spss.GetVariableName(i)) spss.Submit ("DATASET ACTIVATE DATA2.") spss.StartDataStep() ds2 = spss.Dataset () casen = spss.GetCaseCount() label=[] for i in range(casen): label.append(ds2.cases[i]) spss.EndDataStep() #Дополнительный датасет со значениями категориальных переменных столбец 0 - название переменной, 1 - числовое представление, 2 - текстовая метка spss.Submit ("DATASET ACTIVATE DATA3.") spss.StartDataStep() ds3 = spss.Dataset () #Числовое представление тоже должно быть текстовым, valueLabels в SPSS имеет текстовые ключи ds3.varlist[1].type = 1 casel = spss.GetCaseCount() datal=[] #здесь мы формируем таблицу datal - содержащую весь датасет метками for i in range(casel): datal.append(ds3.cases[i]) spss.EndDataStep() spss.Submit ("DATASET ACTIVATE DATA1.") spss.StartDataStep() ds = spss.Dataset () for i in range(varcnt): for j in range(casen): if varlist[i] == label[j][2].strip(): ds.varlist[i].label = label[j][3] #здесь в столбце 6 содержится идентификатор - искать ли метки значений по таблице, если 1, то ищем метки по таблице if label[j][6] == 1: #создаем словарь ldic его заполним значениями для конкретной переменной ldic = {} for k in range(casel): #перебираем весь массив меток и дополняем словарь найденными метками if varlist[i] == datal[k][0].strip(): ldic[datal[k][1]] = datal[k][2] #присваеваем переменной словарь с найденными метками ds.varlist[i].valueLabels = ldic break spss.EndDataStep() end program. |
Может возникнуть такая проблема, пример из Python Reference Guide for IBM SPSS Statistics:
varObj = datasetObj.varlist[‘origin’]
varObj.valueLabels[4] = ‘Korean’
на имеющемся датасете работать отказался и ругался на то, что значение ключа valueLabels[] должно быть текстовым.
Это связано с тем, что ключ в словаре valueLabels[] имеет тот же тип, что и сама переменная (что логично), таким образом перед тем как проводить слияние необходимо убедиться в том, что типы данных переменной, словаря и идентификатора во внешней таблице совпадают. В примере выше все переменные текстовые. В случае необходимости с помощью DataObject.varlist[1].type = 1 можно присвоить тип переменной (0 – числовая, 1 – … для текстовой – где значение – количество знаков) В противном случае получите сообщение вроде этого:
spss.errMsg.SpssError: [errLevel 1033] Аргумент должен быть целым или с плавающей десятичной запятой.
или
spss.errMsg.SpssError: [errLevel 1001] Ожидался текстовый аргумент.