Работа с данными в IBM SPSS: присвоение меток переменным из другого источника

Не редко бывает, что необходимо присвоить метки большому количеству переменных. И хорошо если эти метки где-либо уже записаны. К примеру в таблице, где в виде переменных (полей/столбцов) содержатся данные переменная->метка. Получается такого рода словарь. Делать это вручную с помощью copy/paste не хочется, да и можно сделать ошибку, а переменных может быть очень много. Хорошо, что в 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
*Требуется указать правильный путь к датасетам:
GET
FILE='C:\Users\...\DATA1.sav'.
DATASET NAME DATA1.

GET
FILE='C:\Users\...\DICT.sav'.
DATASET NAME DATA2.

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()
#массив текстовых названий переменных
text=[]
#массив описаний (меток)
des=[]
#Заполняем массивы (здесь 3 и 2 - порядковый номер переменных содержащих название и метку)
for i in range(casen):
   des.append(ds2.cases[i,3][0])
   text.append(ds2.cases[i,2][0])
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] == text[j].strip():
         ds.varlist[i].label = des[j]
break
spss.EndDataStep()

end program.

Необходимо обратить внимание, что в классе spss.Dataset () параметр можно получить используя cases[i,j] в этом случае мы получим объект состоящий из одного элемента строки i и переменной j. Если используем cases[i], то получим всю строку i. Но для получения конкретного значения необходимо использовать cases[i,j][k], где k – порядковый номер значения в объекте. В случае если мы получаем объект из одного элемента, значение этого элемента надо получать так: cases[i,j][0].
Также необходимо удостовериться, что в значениях нет лишних пробелов справа/слева и удалить их(используя, к примеру, text[j].strip()).

Добавить комментарий