【问题标题】:SPSS macro for splitting single numeric variables to multiple variables用于将单个数值变量拆分为多个变量的 SPSS 宏
【发布时间】:2015-03-01 10:12:15
【问题描述】:

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

【问题讨论】:

    标签: spss


    【解决方案1】:

    使用STRING 操作(在converting 之后将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.
    

    您需要权衡每种方法的优缺点,以评估最适合您的方法、您预计数据如何到达以及以后如何继续工作。我没有尝试将其中任何一个包装在一个宏中,但这很容易做到。

    【讨论】:

    • 虽然在这种特殊情况下并不重要,但不推荐使用 substr 函数。请改用 char.substr。 Substr 作用于字节,而 char.substr 作用于字符。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-25
    • 2018-05-13
    • 1970-01-01
    相关资源
    最近更新 更多