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

时间:2017-02-19 02:32:26

标签: spss

我的数据包括奇怪输入的数据。我需要打破一个字符串,该字符串可能包含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. 

2 个答案:

答案 0 :(得分:1)

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

一些数据:
    数据清单/年龄(a5)。
    开始数据
    21个
    22,23
    22.23
    结束数据。

使用extension命令创建两个新变量。如果没有分隔符,则第二个将为空白。无论在何处找到句点或逗号,代码都会将字符串拆分为多个部分。请注意,公式中使用了不同类型的引号字符。

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

如果您想了解有关将Python与统计信息结合使用的更多信息,请从SPSS社区网站下载“编程和数据管理”一书。 https://developer.ibm.com/predictiveanalytics/docs/spss-statistics/programming-and-data-management-book/

答案 1 :(得分:0)

我昨天发布的内容显示了如何轻松拆分单个变量。这是一种扩展它的方法,可以在一次传递中拆分整个变量列表。我只用两个年龄变量来说明。

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

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(<>)".

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

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