用于将单个数字变量拆分为多个变量的SPSS宏

时间:2015-03-01 10:12:15

标签: spss

我在SPSS数据库中有一个名为A的变量。

A
--
102102
23453212
142378
2367890654
2345
45

我想将此变量拆分2个长度并创建多个变量,如下所示。

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宏来计算此操作吗?

1 个答案:

答案 0 :(得分:4)

使用STRING操作(NUMERIC STRING字段后/* Simulate data */. data list list / x (f8.0). begin data. 102102 23453212 142378 2367890654 2345 45 end data. dataset name dsSim. 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. ,如果有必要),特别是converting,您可以提取出数字对愿望。

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.

如果您有一个已知的最大值,在您的示例中长度为10位数,则您需要5个变量来存储数字对,具体如下:

{{1}}

但是,您可能更喜欢更动态地编写类似的东西(使用python),其中代码本身将读取数据中的最大值并根据需要创建尽可能多的变量。

{{1}}

您需要权衡每种方法的优缺点,以评估最适合您的方法,预测数据的到达时间以及之后如何进行工作。我还没有尝试将其中任何一个包装在一个宏中,但这可以很容易地完成。