SPSS 中的嵌套宏和以计算为条件的 !IF-!THEN 命令
Nested macros in SPSS and !IF-!THEN command with calculation as a condition
我需要计算几年。我当然可以分别调用每年的宏。但是,我更愿意只调用一次宏并使用额外的嵌套索引循环 (!DO !var = x !TO y
).
我现在的问题是我还需要一个包含计算的 !IF-!THEN 条件:!IF (!year = !prev_year+1) !THEN
然而,这似乎是不可能的。然后我用一个额外的语法编写了计算的第二部分,然后插入。它有效,但不正确。您可以在下面找到带有示例的语法。
DEFINE !change_hh (lastyear = !TOKENS(1) / lastyear_minus_1=!TOKENS(1) / bedingung = !TOKENS(1) / eyear = !TOKENS(1))
!DO !year= 2011 !TO !lastyear.
!DO !prevyear= 2010 !TO !lastyear_minus_1.
COMPUTE prevyear= !year-1.
exe.
ALTER TYPE prevyear (F4.0).
DO IF $casenum = 1.
WRITE OUTFILE=!QUOTE(!CONCAT("path\anyname_",!year,".sps"))
/"DEFINE @bedingung() ", prevyear, " !ENDDEFINE.".
END IF.
EXE.
INSERT FILE = !QUOTE(!CONCAT("path\anyname_",!year,".sps")).
!IF (!prevyear= !EVAL(!bedingung)) !THEN
COMPUTE !CONCAT("test_year_",!eyear) = !eyear.
COMPUTE !CONCAT("test_prevyear_",!prevyear) = !prevyear.
exe.
!IFEND.
!DOEND.
!DOEND.
EXE.
!ENDDEFINE.
!change_hh lastyear_minus_1 = 2014 lastyear= 2015 bedingung = @bedingung eyear = @jahr.
我只得到变量test_year_2015
和test_prevyear_2014
。怎么了?我只是不明白。
我认为它首先适用于 year = 2011 并经历所有前几年。之后,它使用 year = 2012 并再次遍历所有前几年。等等。
SPSS 宏只能使用宏参数作为(文本)构建块来创建语法。除其他限制外,这意味着宏不能像 !IF (!year = !prev_year+1) !then
那样对参数执行数学运算。
SPSS 宏的另一个限制使得很难在两个单独的日期数组上循环 - 这将是一个自然的解决方案 ()。
STILL - 这里是关于如何在此处获得相同效果的可能建议:
define ....
.....
!let !prevyr="2010"
!do !year= 2011 !to !lastyear.
... use arguments !year and !prevyr ....
!let !prevyr=!year
!doend
在此循环中,在每次迭代结束时,!prevyr
参数接收值或 !year
参数并为下一次迭代做好准备。
我需要计算几年。我当然可以分别调用每年的宏。但是,我更愿意只调用一次宏并使用额外的嵌套索引循环 (!DO !var = x !TO y
).
我现在的问题是我还需要一个包含计算的 !IF-!THEN 条件:!IF (!year = !prev_year+1) !THEN
然而,这似乎是不可能的。然后我用一个额外的语法编写了计算的第二部分,然后插入。它有效,但不正确。您可以在下面找到带有示例的语法。
DEFINE !change_hh (lastyear = !TOKENS(1) / lastyear_minus_1=!TOKENS(1) / bedingung = !TOKENS(1) / eyear = !TOKENS(1))
!DO !year= 2011 !TO !lastyear.
!DO !prevyear= 2010 !TO !lastyear_minus_1.
COMPUTE prevyear= !year-1.
exe.
ALTER TYPE prevyear (F4.0).
DO IF $casenum = 1.
WRITE OUTFILE=!QUOTE(!CONCAT("path\anyname_",!year,".sps"))
/"DEFINE @bedingung() ", prevyear, " !ENDDEFINE.".
END IF.
EXE.
INSERT FILE = !QUOTE(!CONCAT("path\anyname_",!year,".sps")).
!IF (!prevyear= !EVAL(!bedingung)) !THEN
COMPUTE !CONCAT("test_year_",!eyear) = !eyear.
COMPUTE !CONCAT("test_prevyear_",!prevyear) = !prevyear.
exe.
!IFEND.
!DOEND.
!DOEND.
EXE.
!ENDDEFINE.
!change_hh lastyear_minus_1 = 2014 lastyear= 2015 bedingung = @bedingung eyear = @jahr.
我只得到变量test_year_2015
和test_prevyear_2014
。怎么了?我只是不明白。
我认为它首先适用于 year = 2011 并经历所有前几年。之后,它使用 year = 2012 并再次遍历所有前几年。等等。
SPSS 宏只能使用宏参数作为(文本)构建块来创建语法。除其他限制外,这意味着宏不能像 !IF (!year = !prev_year+1) !then
那样对参数执行数学运算。
SPSS 宏的另一个限制使得很难在两个单独的日期数组上循环 - 这将是一个自然的解决方案 (
STILL - 这里是关于如何在此处获得相同效果的可能建议:
define ....
.....
!let !prevyr="2010"
!do !year= 2011 !to !lastyear.
... use arguments !year and !prevyr ....
!let !prevyr=!year
!doend
在此循环中,在每次迭代结束时,!prevyr
参数接收值或 !year
参数并为下一次迭代做好准备。