macros - SPSS/macro:将字符串拆分为多个变量
问题描述
我正在尝试将字符串变量拆分为多个虚拟编码变量。我使用这些资源来了解如何在 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 宏逻辑的新理解(感谢@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.
推荐阅读
- python - 如何调整管道内随机森林分类器中的参数?
- python - 为什么删除字符串和更新数据集的代码不起作用?
- python - Python Tkinter GUI 执行 python 脚本错误
- javascript - 重定向未经身份验证的用户nuxt js
- javascript - Puppeteer 经常在 Twitter 上因超时错误导致 waitForNavigation 失败
- python - 如何使用 dask 旋转一个非常大的数据框?
- css - CSS:选择深度嵌套元素的最佳实践
- python - 无法访问 Jupyter 笔记本
- java - 如何在数字中的小数点后附加零代替空格?
- lua - 谁能帮我清除错误?