SPSS:如何编写对多个变量使用多个 "Computes"(Char.Substr 和 Char.Index)的宏(循环等)。 (每个 Var(29) 5-6 个输出)

SPSS: How to code a macro (loop etc.) that uses multiple "Computes" (Char.Substr and Char.Index) for multiple variables. (5-6 outputs per Var(29))

我的数据包含奇怪的输入数据。我需要拆分一个字符串,该字符串可能包含 1-2 位数字的年龄,或者由逗号或句点分隔的两个年龄。逗号表示持续暴露,句点表示单独事件。

我有应用于单个变量的基本代码,但我只花了 2-3 个小时尝试自动化,这样我们就可以在一行中更改它,而不是分别编写 29 次代码。以为这很容易,但我一直在搞循环和“!”在这一点上太久了。任何指导将不胜感激。

如果有帮助,现有代码如下。

**Split Ages and Determine Continuous or Intermittent.
*ID position of comma and period.
Compute Period = CHAR.INDEX (Var, ".").
Execute. 

Compute Comma = CHAR.INDEX (Var, ",").
Execute.  

*Seperate ages into seperate variables.
STRING Age1(A2)    Age2(A2).

DO IF (Comma = 2 or Period=2).
COMPUTE Age1 = CHAR.SUBSTR (Var,1,1).
COMPUTE Age2 = CHAR.SUBSTR (Var,3).

ELSE IF (Comma = 3  or Period=3).
COMPUTE Age1 = CHAR.SUBSTR (Var,1,2).
COMPUTE Age2 = CHAR.SUBSTR (Var,4).

ELSE IF (Comma = 0 and Period = .00).
COMPUTE Age1 = Var.
END IF.

*Convert String to Numeric.
alter type Age1(f2).
alter type Age2(f2).
execute.

*Cont or Int.
DO IF (Period >0).
Compute Multiple = 1.
END IF.

DO IF (Comma >0).
Compute Duration = Age2 - Age1.
END IF. 


EXECUTE. 

一个更简单的方法是使用一段 Python 代码和 SPSSINC TRANS 扩展命令,它通常与 Statistics 一起安装。

一些数据:
数据列表list /age(a5).
开始数据
21
22,23
22.23
端数据。

使用扩展命令创建两个新变量。如果没有分隔符,第二个将为空白。只要发现句点或逗号,代码就会将字符串拆分成多个部分。请注意,公式中使用了不同类型的引号字符。

spssinc trans result=part1 part2 type=2
/formula "re.split('[.,]',age)".

如果您想详细了解如何使用 Python 和 Statistics,请从 SPSS Community 网站下载《编程和数据管理》一书。 https://developer.ibm.com/predictiveanalytics/docs/spss-statistics/programming-and-data-management-book/

我昨天发布的内容展示了如何轻松拆分单个变量。这是一种扩展它以一次性拆分整个变量列表的方法。我将仅用两个年龄变量来说明。

首先,您定义一个可以遍历多个变量的拆分函数。

begin program.
import re
def splitter(*x):
    # x is a list of values to split
    result = []
    for item in x:
        splits =  re.split("[.,]", item)
        if len(splits) == 1:
            splits.append("")
        result.extend(splits)
    return(result)
end program.

然后指定带有所有年龄变量的 SPSSINC TRANS 命令。在示例中,我使用 TO 来引用连续变量列表,但您也可以列出所有单独的变量名称。

结果变量列表使用 TO 并指定两倍于输入的变量。同样,如果需要,您可以列出特定的变量名称。

spssinc trans result=part1 to part4 type=2
/variables age to age2
/formula "splitter(<>)".

此处的尖括号表示 variables 子命令中列出或暗示的所有变量都应作为参数传递。

p.s。如果您希望结果变量是数字而不是字符串,您可以将类型从 2 更改为 0。如果输入中没有句点或逗号,这将使配对系统中的第二个变量丢失。