【问题标题】:Nested macros in SPSS and !IF-!THEN command with calculation as a conditionSPSS 和 !IF-!THEN 命令中的嵌套宏,以计算为条件
【发布时间】:2020-03-20 22:02:32
【问题描述】:

我需要计算几年。我当然可以分别调用每年的宏。但是,我更愿意只调用一次宏并使用额外的嵌套索引循环 (!DO !var = x !TO y)。

我现在的问题是我还需要一个包含计算的 !IF-!THEN-condition:!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_2015test_prevyear_2014。怎么了?我只是不明白。 我认为它首先适用于 year = 2011 并经历了所有 prevyears。之后,它适用于 year = 2012 并再次遍历所有 prevyears。以此类推。

【问题讨论】:

  • 正是我想要的。谢谢!

标签: spss


【解决方案1】:

SPSS 宏只能使用宏参数作为(文本)构建块来创建语法。除其他限制外,这意味着宏不能像!IF (!year = !prev_year+1) !then 那样对参数执行数学运算。

SPSS 宏的另一个限制是很难在两个单独的日期数组上循环 - 这将是一个自然的解决方案 (see my answer here for an idea about how to do that)。

STILL - 这里有一个关于如何在此处获得相同效果的可能建议:

define ....
.....
!let !prevyr="2010"
!do !year= 2011 !to !lastyear.
  ... use arguments !year and !prevyr ....
  !let !prevyr=!year
!doend

在此循环中,在每次迭代结束时,!prevyr 参数接收值或!year 参数并准备好进行下一次迭代。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-20
    • 1970-01-01
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多