Работа с данными в IBM SPSS: присвоение значений для категориальных переменных

Допустим необходимо большому количеству переменных присвоить значения категорий. К примеру есть переменная содержащая значения 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] Ожидался текстовый аргумент.