首页 > 解决方案 > SPSS/macro:将字符串拆分为多个变量

问题描述

我正在尝试将字符串变量拆分为多个虚拟编码变量。我使用这些资源来了解如何在 SPSS 中完成这项任务:

但是当我尝试使第一个适应我的需要时,或者当我尝试将第二个转换为宏时,我失败了。

在我的数据集中,我有(多个)变量,其中包含一个逗号分隔的字符串,表示所选项目的不同组合(以及缺失值)。对于特定变量的每个项目,我想创建一个虚拟变量。如果该项目被选中,它应该在新的虚拟变量中用 1 表示。如果未选择,则该情况应以 0 表示。不同的输入变量可以包含不同数量的项目。

例如:

ID VAR1 VAR2 DMMY1_1 DMMY1_2 DMMY1_3
1 1, 2 8 1 1 0
2 1 1、3 1 0 0
3 3, 1 2、3、1 1 0 1
4 2、8 0 0 0

这是我到目前为止想出的...


* DEFINE DATA. 

DATA LIST /ID 1 (F) VAR1 2-5 (A) VAR2 6-12 (A).
BEGIN DATA
11, 28
21   1, 3
33, 12, 3, 1
4    2, 8
END DATA.

* MACRO SYNTAX.

* DEFINE VARIABLES (in the long run these should/will be inside the macro function, but for now I will leave them outside).
NUMERIC v1 TO v3 (F1).
VECTOR v = v1 TO v3.
STRING #char (A1).

DEFINE split_var(vr = TOKENS(1)).
    !DO !#pos=1 !TO char.length(!vr).
        COMPUTE #char = char.substr(!vr, !#pos, 1).
        !IF (!#char !NE "," !AND !#char !NE " ") !THEN
            COMPUTE v(NUMBER(!#char, F1)) = 1.
        !IFEND.        
    !DOEND.
!ENDDEFINE.

split_var vr=VAR1.
EXECUTE.

由于我遇到的错误数不胜数,因此很难缩小我的问题范围。但我认为这个问题与我使用char.length()函数的方式有关(我对何时使用 bang 运算符有点困惑)。

如果有人有一些见解,我将非常感谢一些帮助:)

标签: macrosspss

解决方案


随着我对 SPSS 宏逻辑的新理解(感谢@eli-k),这个问题很容易解决。这是工作解决方案。

* DEFINE DATA. 

DATA LIST /ID 1 (F) VAR1 2-5 (A) VAR2 6-12 (A).
BEGIN DATA
11, 28
21   1, 3
33, 12, 3, 1
4    2, 8
END DATA.

* DEFINE MACRO.
DEFINE @split_var(src_var = !TOKENS(1) 
                        /dmmy_var_label = !DEFAULT(dmmy) !TOKENS(1)
                        /dmmy_var_lvls = !TOKENS(1))
    NUMERIC !CONCAT(!dmmy_var_label,1) TO !CONCAT(!dmmy_var_label, !dmmy_var_lvls) (F1).
    VECTOR #dmmy_vec = !CONCAT(!dmmy_var_label,1) TO !CONCAT(!dmmy_var_label, !dmmy_var_lvls).
    STRING #char (A1).
    LOOP #pos=1 TO char.length(!src_var).
        COMPUTE #char = char.substr(!src_var, #pos, 1).
        DO IF (#char NE "," AND #char NE " ").
            COMPUTE #index = NUMBER(#char, F1).
            COMPUTE #dmmy_vec(#index) = 1.
        END IF.
    END LOOP.
    RECODE  !CONCAT(!dmmy_var_label,1) TO !CONCAT(!dmmy_var_label, !dmmy_var_lvls) (SYSMIS=0) (ELSE=COPY).
    EXECUTE.
!ENDDEFINE.

* CALL MACRO.
@split_var src_var=VAR2 dmmy_var_lvls=8.

推荐阅读