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。如果输入中没有句点或逗号,这将使配对系统中的第二个变量丢失。
我的数据包含奇怪的输入数据。我需要拆分一个字符串,该字符串可能包含 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。如果输入中没有句点或逗号,这将使配对系统中的第二个变量丢失。