Макрос SPSS для разделения одной числовой переменной на несколько переменных

У меня есть переменная с именем A в базе данных SPSS.

A
--
102102
23453212
142378
2367890654
2345
45

Я хочу разделить эту переменную на две длины и создать несколько переменных следующим образом.

A_1   A_2   A_3   A_4   A_5
---   ---   ---   ---   ---
10    21    02
23    45    32    12
14    23    78
23    67    89    06    54
23    45
45

Кто-нибудь может написать макрос SPSS для вычисления этой операции?


person Md. Sahidul Islam    schedule 01.03.2015    source источник


Ответы (1)


Использование STRING манипуляций (после преобразование поля NUMERIC в STRING, если необходимо), в частности SUBSTR вы можете извлекать пары цифр по своему усмотрению.

/* Simulate data */.
data list list / x (f8.0).
begin data.
102102
23453212
142378
2367890654
2345
45
end data.
dataset name dsSim.

Если у вас есть известное максимальное значение, в вашем примере значение длиной 10 цифр, вам потребуется 5 переменных для хранения пар цифр, что делает следующее:

preserve.
set mxwarns 0 /* temporarily supress warning messages */ .
string #xstr (a10).
compute #xstr=ltrim(string(x,f18.0)).
compute A_1=number(substr(#xstr,1,2), f8.0).
compute A_2=number(substr(#xstr,3,2), f8.0).
compute A_3=number(substr(#xstr,5,2), f8.0).
compute A_4=number(substr(#xstr,7,2), f8.0).
compute A_5=number(substr(#xstr,9,2), f8.0).
exe.
restore.

Однако вы можете предпочесть кодировать что-то подобное более динамично (с использованием python), где сам код будет считывать максимальное значение в данных и создавать столько переменных, сколько необходимо.

begin program.
import spssdata, math
spss.Submit("set mprint on.")

# get maximum value 
spss.Submit("""
dataset declare dsAgg.
aggregate outfile=dsAgg /MaxX=max(x).
dataset activate dsAgg.
""")

maxvalue = spssdata.Spssdata().fetchone()[0]
ndigits=math.floor(math.log(maxvalue,10))+1

cmd="""
dataset close dsAgg.
dataset activate dsSim.
preserve.
set mxwarns 0.
string #xstr (a10).
compute #xstr=ltrim(string(x,f18.0)).
"""

for i in range(1,int(math.ceil(ndigits/2))+1):
    j=(i-1)*2+1
    cmd+="\ncompute B_%(i)s=number(substr(#xstr,%(j)s,2), f8.0)." % locals()
cmd+="\nexe.\nrestore."

spss.Submit(cmd)

spss.Submit("set mprint off.")
end program.

Вам нужно будет взвесить все за и против каждого метода, чтобы оценить, какой из них подходит вам лучше всего, как вы ожидаете, что ваши данные поступят, и как вы затем приступите к работе позже. Я не пытался обернуть ни один из них в макрос, но это можно было бы сделать так же легко.

person Jignesh Sutar    schedule 01.03.2015
comment
Хотя в данном конкретном случае это не имеет значения, функция substr устарела. Вместо этого используйте char.substr. Substr работает с байтами, а char.substr работает с символами. - person JKP; 02.03.2015