问题描述
我正在尝试将一个字符串变量拆分为多个虚拟编码变量。我使用这些资源来了解如何在 SPSS 中完成这项任务:
- https://www.ibm.com/support/pages/making-multiple-string-variables-single-multiply-coded-field
- https://www.spss-tutorials.com/spss-split-string-variable-into-separate-variables/
但是当我尝试使第一个适应我的需要或当我尝试将第二个转换为宏时,我失败了。
在我的数据集中,我有(多个)变量,这些变量包含一个逗号分隔的字符串,表示所选项目(以及缺失值)的不同组合。对于特定变量的每个项目,我想创建一个虚拟变量。如果该项目被选中,它应该在新的虚拟变量中用 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 运算符有点困惑)。
如果有人有一些见解,我将非常感谢您的帮助:)
解决方法
了解 SPSS 宏有一个基本问题 - 宏不读取数据或以任何方式与数据交互。宏所做的就是操作文本以编写语法。创建的语法稍后将在您运行时处理实际数据。
因此,例如,您的第一个错误是在语法中使用 char.length(!vr)
。您正试图让宏读取数据、计算长度和使用,但这根本无法完成 - 宏只能使用您提供的内容。
代码中的另一个示例:计算 #char
,然后尝试在宏中将其用作 !#char
。所以这显然行不通。 !
仅在宏函数或参数之前。 #char
,在您的代码中,两者都不是,也不能成为一个 - 无法将数据读入宏...
给你一点推动:我知道你希望宏循环为每个变量运行不同的次数,但你不能使用 char.length(!vr)。我建议您根据需要多次使用宏循环,以确保您可以处理需要使用的最长变量。
另一个一般策略提示 - 首先,创建语法来处理一个特定的变量和一个特定的分隔符。一旦成功,开始处理宏,记住宏的唯一目的是重新创建相同的工作语法,只更改变量名和分隔符的参数。
,根据我对 SPSS 宏逻辑的新理解(感谢@eli-k),这个问题很容易解决。这是有效的解决方案。
{{1}}